С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
758 / 455 / 213
Регистрация: 19.12.2016
Сообщений: 1,815
1

Ошибка при std::transform() для std::initializer_list<int>

09.03.2022, 10:41. Показов 1536. Ответов 6

Author24 — интернет-сервис помощи студентам
Здравствуйте! Написал код. Там 3 целочисленных переменных. С помощью них инициализировал список инициализации и массив. Применил к ним трансформирование. С массивом ошибок нет, а со списком получаю ошибку, что нельзя присваивать константе новое значение (это по памяти в VS), в онлайн компиляторе error: assignment of read-only location ‘* __result’. Можете объяснить в чем причина ошибки. Вот мой код. Спасибо!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <algorithm>
#include <initializer_list>
 
int main()
{
    int a = 1, b = 3, c = 2;
    int arr[3]{a, b, c};
    std::initializer_list<int> l{a, b, c};
    int max = 0;
    //std::transform(l.begin(), l.end(), l.begin(), [&max](int value){return max = max > value ? max : value;});//Здесь ошибка
    for(auto &x: l)
    {
        std::cout << x << " ";
    }
    max = 0;
    std::transform(std::begin(arr), std::end(arr),std::begin(arr), [&max](int value){return max = max > value ? max : value;});
    std::cout << "\n";
    for(auto &x: arr)
    {
        std::cout << x << " ";
    }
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.03.2022, 10:41
Ответы с готовыми решениями:

Странная ошибка: [Error] no match for call to '(std::string {aka std::basic_string<char>}) (int&)'
У меня появляется проблема при компиляции сей программы: #include &lt;iostream&gt; #include &lt;string&gt;...

std::getline Альтернатива для (std::string, int, char)
Есть у кого идеи? Есть строка чисел(разделены пробелами), хочу считывать числа до пробела в инт...

На основе исходного std::vector<std::string> содержащего числа, создать std::vector<int> с этими же числами
подскажите есть вот такая задача. Есть список . Создать второй список, в котором будут все эти же...

ошибка error: cannot convert 'std::string {aka std::basic_string<char>}' to 'std::string* {aka std::basic_stri
на вод поступают 2 строки типа string. определить количество вхождений строки 2 в строку 1 ошибка...

Ошибка [Warning] non-static data member initializers only available with -std=c++11 or -std=gnu++11 при компиляции
Доброго времени суток. Компилятор выдает ошибку non-static data member initializers only...

6
Неэпический
18109 / 10696 / 2062
Регистрация: 27.09.2012
Сообщений: 26,939
Записей в блоге: 1
09.03.2022, 10:46 2
Лучший ответ Сообщение было отмечено ram876 как решение

Решение

Цитата Сообщение от ram876 Посмотреть сообщение
Можете объяснить в чем причина ошибки
Нельзя изменять элементы std::initializer_list, begin и end дают const T*.
1
Любитель чаепитий
3744 / 1800 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
09.03.2022, 10:47 3
Лучший ответ Сообщение было отмечено ram876 как решение

Решение

у std::initializer_list методы begin и end возвращают указатели на константу.
1
758 / 455 / 213
Регистрация: 19.12.2016
Сообщений: 1,815
09.03.2022, 10:51  [ТС] 4
При:
C++
1
std::transform(std::begin(l), std::end(l), std::begin(l), [&max](int value){return max = max > value ? max : value;});
также получаю ошибку. Или при любом случае он вернет конст?
0
Любитель чаепитий
3744 / 1800 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
09.03.2022, 10:56 5
Лучший ответ Сообщение было отмечено ram876 как решение

Решение

Цитата Сообщение от ram876 Посмотреть сообщение
Или при любом случае он вернет конст?
std::begin и std::end просто вызывают begin() и end() у того контейнера, который в них передают. отличие только для массивов.
так что если методы begin и end только константные, то они и вызовутся.
1
2859 / 2006 / 988
Регистрация: 21.12.2010
Сообщений: 3,711
Записей в блоге: 10
09.03.2022, 11:06 6
внезапно так заработало
C++
1
std::transform(l.begin(), l.end(), const_cast<int*>(l.begin()), [&max](int value){return max = max > value ? max : value;});
1
Неэпический
18109 / 10696 / 2062
Регистрация: 27.09.2012
Сообщений: 26,939
Записей в блоге: 1
09.03.2022, 11:33 7
Цитата Сообщение от igorrr37 Посмотреть сообщение
внезапно так заработало
UB.
The underlying array may be allocated in read-only memory.
2
09.03.2022, 11:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.03.2022, 11:33
Помогаю со студенческими работами здесь

Ошибка terminate called after throwing an instance of 'std::bad_alloc' при работе с типом std::string
Добрый вечер, при работе функции возникает ошибка terminate called after throwing an instance...

Std::unordered_multimap<std::string, int> map
Приветствую. Как можно получить только &quot;уникальный&quot; ключ в контейнере? ...

Std::initializer_list wchar_t
Подскажите, не удаётся сделать функцию добавления в массив wchar_t template&lt;class T0, class T1&gt;...

Не воспринимает ни std::cout, ни std::cin. Вобщем ничего из std. Также не понимает iostream
Здравствуйте! Я хотел начать изучать язык C++. Набрал литературы. Установил Microsoft Visual C++...

Расстановка девяти чисел (Turbo C) Выводит ошибку using Matrix = std::array<std::array<int, 3>, 3>; и bool NextSet
#include &lt;iostream&gt; #include &lt;array&gt; using Matrix = std::array&lt;std::array&lt;int, 3&gt;, 3&gt;; //...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru