Как исправить ошибку «Нет совпадений для оператора []» (С++)

Итак, мне дали этот массив: 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])); но я не знаю, как это исправить.

Используйте std::vector. Нет не список, а массив в стиле C.

Jesper Juhl 07.04.2019 16:08

@drescherjm хорошо, тогда я получил эту ошибку: не могу преобразовать 'std::__cxx11::list<int>' в 'int*' для аргумента '1' в 'int LargestOfArray(int*)'|

Alpha 07.04.2019 16:08

Извините, я перепутал arr и ar. Это одна из причин использовать хорошие имена переменных.

drescherjm 07.04.2019 16:09

@Alpha убедитесь, что у вас есть четкие имена переменных. Это досталось бы даже более опытным программистам.

user5550963 07.04.2019 16:26
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
15 118
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

У вас опечатка в вашем условии 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.

я хотел передать обр, но почему-то запутался

Alpha 07.04.2019 16:22
Ответ принят как подходящий

Во-первых, вы используете как ar, так и arr, а arr — это массив, а ar — список. Это сбивает с толку и читателя, и (как оказалось) автора кода.

В C++ std::list не имеет произвольного доступа. Вы не можете использовать ar[], так как оператор [] не определен для списков. Кроме того, largestOfArray ожидает массив, а не список. Вероятно, вы намеревались использовать arr вместо ar.

Используя ответ std::list:

  1. Сделать наибольший из массивов для получения списка
  2. Заставить наибольший из массивов возвращать наибольшее значение
  3. Чтобы удалить элемент, вы должны вызвать ar.erase(find(value));

Расширенный ответ:

Здесь есть множество вещей, которые можно улучшить.

  1. Обычно предпочитают std::vector вместо std::list
  2. Используйте std::accumulate для вычисления суммы
  3. Ваш код хрупок и не обрабатывает разные размеры массивов (используйте std::size)
  4. Элементы std::list не могут быть доступны по индексу
  5. std::max_element можно использовать для поиска максимального элемента
  6. Если у вас не может быть дубликатов, используйте std::set, а не std::vector
  7. Если вас не волнует порядок, я бы использовал вектор, (обратно) отсортировал вектор, а затем продолжал выталкивать заднюю часть вектора, пока ваша сумма превышает 500

Код, который вы не пишете, не может содержать ошибок (вообще говоря). Вы должны просмотреть все функции внутри заголовка <algorithm>, чтобы увидеть, что может вам помочь.

1. Список имеет свои преимущества, элемент списка удаляется быстрее, чем std::vector. прочитайте это: thispointer.com/difference-between-vector-and-list-in-c

user5550963 07.04.2019 16:20

да, я новичок в С++, так что .. я понятия не имею, о чем вы говорите, xd, я попытаюсь найти их позже, хотя, когда я узнаю больше о С++, спасибо, кстати :)

Alpha 07.04.2019 16:20

@Alpha, придерживайся того, что знаешь. и прочитайте это: thispointer.com/difference-between-vector-and-list-in-c

user5550963 07.04.2019 16:22

@Gox Я знаю, что у списка есть преимущества, поэтому я сказал в целом (кстати, быстрее удалить из конца вектора, чем из конца списка).

Gregory Currie 07.04.2019 16:23

В вашем коде много ошибок.

  • Пожалуйста, посмотрите, как список определяется в C++.
  • Проверьте, что такое статический массив, что такое динамический массив.
  • Используйте {} для каждого цикла. Особенно новичку будет легче читать и находить ошибки.
  • Узнайте, как передавать аргументы функциям в C++.

Вот простое решение:

#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;
}

добавьте также, как вы можете отобразить число в массиве после удаления?

Alpha 08.04.2019 14:57

Пожалуйста, скажите мне, какую часть вы не понимаете

johnny b 09.04.2019 10:34

Если вы хотите отобразить числа в массиве, вам просто нужно перебрать список, как я сделал это в функциях sumOfList и largeInList. Затем вы используете, например. cout для вывода значений.

johnny b 09.04.2019 10:38

цикл for в двух функциях

Alpha 09.04.2019 13:37

как константа auto и '&n' и '&lel'

Alpha 09.04.2019 13:49

Это диапазон, основанный на цикле for. Новая функция в C++11. Посмотрите здесь: geeksforgeeks.org/range-based-loop-c Если он не компилируется, вы сказали своему компилятору использовать C++11. Например. g++ -std=c++11 test.cpp

johnny b 09.04.2019 15:54

Константа, которую вы используете, чтобы прояснить, что вы хотите только читать значения, но не переопределять значения

johnny b 09.04.2019 15:56

Используется ключевое слово auto, для которого не нужно явно задавать тип. Компилятор автоматически знает, что в этом случае ему нужно использовать 'int' в качестве типа. Таким образом, вы можете просто заменить int на auto.

johnny b 09.04.2019 15:59

'&' означает, что вы возьмете ссылку: int a = 5; интервал б = а; интервал и с = а; в случае b вы копируете значение a в память b. В случае c вы просто берете ссылку a. Получение ссылки требует меньших вычислительных усилий, чем копирование. Если вас не волнуют вычислительные затраты, вы можете просто опустить '&'.

johnny b 09.04.2019 16:02

До C++11 цикл for выглядел так: ; }

johnny b 09.04.2019 16:08

Другие вопросы по теме