Итак, мне дали этот массив:
int arr[] = {60,70,30,15,17,80,16,75,90,85,40,75};
Я должен «поместить» как можно больше элементов в этот массив, если их сумма будет меньше 500 (в основном удаляя самый большой элемент, пока сумма не станет меньше 500).
Это то, что я пробовал:
#include <iostream>
#include <algorithm>
#include <list>
using namespace std;
int largestOfArray(int number[]);
int main()
{
int sum = 0;
int i = 0;
int arr[] = {60,70,30,15,17,80,16,75,90,85,40,75};
list<int> ar(arr,arr+12);
for (i = 0; i < 12;i++)
sum += arr[i];
while (sum > 500)
ar.remove(largestOfArray(arr[12]));
for (i = 0; i < 12;i++)
sum += arr[i];
for (i = 0;i < 12; i++)
cout << arr[i];
cout << sum;
return 0;
}
int largestOfArray(int number[12]){
int i = 0;
int largest = number[0];
for (i = 0;i < 12;i++){
if (largest < number[i]) largest = number[i];
}
return largest;
}
Я продолжаю получать эту ошибку:
no match for 'operator[]' (operand types are 'std::__cxx11::list' and 'int')
Я знаю, что это как-то связано с ar.remove(largestOfArray(ar[12]));
но я не знаю, как это исправить.
@drescherjm хорошо, тогда я получил эту ошибку: не могу преобразовать 'std::__cxx11::list<int>' в 'int*' для аргумента '1' в 'int LargestOfArray(int*)'|
Извините, я перепутал arr
и ar
. Это одна из причин использовать хорошие имена переменных.
@Alpha убедитесь, что у вас есть четкие имена переменных. Это досталось бы даже более опытным программистам.
У вас опечатка в вашем условии while. смотрите ar[12]
.
Ваша проблема заключается в передаче массива:
Вы не передаете массив следующим образом:
function(arr[10])
Строка выше передает 11-й элемент в function()
Чтобы передать весь массив, вы передаете имя массива.
function(arr)
В твоем случае:
largestOfArray(arr[12])
проходит 13-й элемент arr
это должно быть:
largestOfArray(arr)
в этой строке:
while (sum > 500) ar.remove(largestOfArray(arr[10]));
Обновлено:
Теперь, когда я вижу, что происходит, у std::list
нет оператора []
https://en.cppreference.com/w/cpp/container/list, почему его нет? Это может помочь: https://thispointer.com/difference-between-vector-and-list-in-c/
в основном
largestOfArray()
принимает массив, поэтому я не знаю, вы хотели передать arr
или ar
.
я хотел передать обр, но почему-то запутался
Во-первых, вы используете как ar
, так и arr
, а arr
— это массив, а ar
— список. Это сбивает с толку и читателя, и (как оказалось) автора кода.
В C++ std::list не имеет произвольного доступа. Вы не можете использовать ar[]
, так как оператор [] не определен для списков. Кроме того, largestOfArray
ожидает массив, а не список. Вероятно, вы намеревались использовать arr
вместо ar
.
Используя ответ std::list:
Расширенный ответ:
Здесь есть множество вещей, которые можно улучшить.
Код, который вы не пишете, не может содержать ошибок (вообще говоря). Вы должны просмотреть все функции внутри заголовка <algorithm>, чтобы увидеть, что может вам помочь.
1. Список имеет свои преимущества, элемент списка удаляется быстрее, чем std::vector
. прочитайте это: thispointer.com/difference-between-vector-and-list-in-c
да, я новичок в С++, так что .. я понятия не имею, о чем вы говорите, xd, я попытаюсь найти их позже, хотя, когда я узнаю больше о С++, спасибо, кстати :)
@Alpha, придерживайся того, что знаешь. и прочитайте это: thispointer.com/difference-between-vector-and-list-in-c
@Gox Я знаю, что у списка есть преимущества, поэтому я сказал в целом (кстати, быстрее удалить из конца вектора, чем из конца списка).
В вашем коде много ошибок.
Вот простое решение:
#include <iostream>
#include <algorithm>
#include <list>
using namespace std;
int largestInList(const list<int> &numbers);
int sumOfList(const list<int> &numbers);
int main()
{
int i,c = 0;
int arr[] = {60,70,30,15,17,80,16,75,90,85,40,75};
list<int> mylist(arr,arr+12);
int sum = sumOfList(mylist);
while (sum > 500)
{
int largest = largestInList(mylist);
for (list<int>::iterator i=mylist.begin(); i!=mylist.end(); i++)
{
if (*i == largest)
{
mylist.erase(i);
break;
}
}
sum = sumOfList(mylist);
}
cout << sum << endl;
return 0;
}
int sumOfList(const list<int> &numbers)
{
int sum = 0;
//For Loop before C++11:
//for (list<int>::const_iterator it = numbers.begin(); it != numbers.end(); ++it)
//{
// sum += *it;
//}
for (const auto &lel : numbers)
sum += lel;
return sum;
}
int largestInList(const list<int> &numbers){
list<int>::const_iterator it = numbers.begin();
int largest = *it;
for (const auto &n : numbers){
if (largest < n) largest = n;
}
return largest;
}
добавьте также, как вы можете отобразить число в массиве после удаления?
Пожалуйста, скажите мне, какую часть вы не понимаете
Если вы хотите отобразить числа в массиве, вам просто нужно перебрать список, как я сделал это в функциях sumOfList и largeInList. Затем вы используете, например. cout для вывода значений.
цикл for в двух функциях
как константа auto и '&n' и '&lel'
Это диапазон, основанный на цикле for. Новая функция в C++11. Посмотрите здесь: geeksforgeeks.org/range-based-loop-c Если он не компилируется, вы сказали своему компилятору использовать C++11. Например. g++ -std=c++11 test.cpp
Константа, которую вы используете, чтобы прояснить, что вы хотите только читать значения, но не переопределять значения
Используется ключевое слово auto, для которого не нужно явно задавать тип. Компилятор автоматически знает, что в этом случае ему нужно использовать 'int' в качестве типа. Таким образом, вы можете просто заменить int на auto.
'&' означает, что вы возьмете ссылку: int a = 5; интервал б = а; интервал и с = а; в случае b вы копируете значение a в память b. В случае c вы просто берете ссылку a. Получение ссылки требует меньших вычислительных усилий, чем копирование. Если вас не волнуют вычислительные затраты, вы можете просто опустить '&'.
До C++11 цикл for выглядел так: ; }
Используйте
std::vector
. Нет не список, а массив в стиле C.