Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
131 / 130 / 64
Регистрация: 11.11.2010
Сообщений: 807
Записей в блоге: 14
1

Ошибка с типами в STL accumulate

04.04.2017, 12:12. Просмотров 310. Ответов 10
Метки нет (Все метки)

C++
1
2
3
4
5
6
    map<char, map<char, int>> Msucc;
    // заполнение Msucc
    map<char, int> strSum;
    for( auto i : Msucc )
        strSum[i.first] = accumulate( i.second.begin(), i.second.end(), 0,
            [] ( pair<char, int> p ) { return p.second; } );  // (1)
в (1) ошибка:
error: no match for call to '(vowConsAnalyze(const string&)::<lambda(std:: pair<char, int>)>) (int&, std:: pair<const char, int>&)'

И вообще, стоит ли так делать? Может быть, лучше:
C++
1
2
3
4
    // ...
    for( auto i : Msucc )
        for( auto p : i.second )
            strSum[i.first] += p.second;
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.04.2017, 12:12
Ответы с готовыми решениями:

accumulate if?
Какой алгоритм способен найти сумму элементов, удовлетворяющих какому-либо условию?

алгоритм accumulate
Допустим у меня есть вектор.Мне нужно подсчитать выборочно в нем сумму элементов.Я использую...

Ошибка с типами в шаблоне функции
1&gt;c:\users\nano\desktop\visual studio\homework\homework\homework.cpp(10): error C2563:...

Ошибка с типами в шаблоне функции
#include &lt;iostream&gt; #include &lt;typeinfo&gt; using namespace std; template&lt;typename T1, typename...

10
Любитель чаепитий
3452 / 1575 / 490
Регистрация: 24.08.2014
Сообщений: 5,463
Записей в блоге: 1
04.04.2017, 12:22 2
первый параметр value_type в мапе всегда const, std::pair<const char, int> p в лямбде.
1
шКодер самоучка
2094 / 1837 / 894
Регистрация: 09.10.2013
Сообщений: 4,008
Записей в блоге: 7
04.04.2017, 12:33 3
std::accumulate принимает функтор с двумя параметрами - текущее значение "суммы" и текущий элемент.
2
131 / 130 / 64
Регистрация: 11.11.2010
Сообщений: 807
Записей в блоге: 14
04.04.2017, 14:26  [ТС] 4
И тогда подскажите ещё, почему:
C++
1
2
3
4
5
6
7
8
9
10
11
    map<char, int> a;
    // заполнение a
 
        for( pair<char, int> &&aa : a )
            if( aa.second > 0 )
            {
                if( aa.first == b )
                    aa.second = 0;  // не происходит модификация a
                else
                    aa.second -= c;  // не происходит модификация a
            }
0
шКодер самоучка
2094 / 1837 / 894
Регистрация: 09.10.2013
Сообщений: 4,008
Записей в блоге: 7
04.04.2017, 15:06 5
Цитата Сообщение от GoldenId Посмотреть сообщение
не происходит модификация a
как уже сказали выше - ключи у std::map константные.
В вашем коде происходит неявное приведение из std::pair<const char, int> в std::pair<char, int> и далее в цикле вы работаете со временным объектом типа std::pair<char, int>

используйте в качестве указания типа auto&, если нужна модификация элемента, и const auto&, если нужен простой перебор
C++
1
2
3
4
5
6
for (auto& item : data) {
    // изменяем элементы
}
for (const auto& item : data) {
    // перебираем элементы
}
если же нужно явное указание типа, то можно использовать std::map<key_type, mapped_type>::value_type/std::map<key_type, mapped_type>::reference
C++
1
2
3
for (std::map<char, int>::reference item : data) {
    // изменяем элементы
}
0
techpriest
633 / 212 / 57
Регистрация: 27.02.2014
Сообщений: 1,174
04.04.2017, 15:12 6
А есть отличие между

C++
1
2
3
for (auto& ref : data) {...}
и
for (auto&& ref : data) {...}
И то и другое вроде бы будет обычной ссылкой... Или нет?
1
131 / 130 / 64
Регистрация: 11.11.2010
Сообщений: 807
Записей в блоге: 14
04.04.2017, 15:41  [ТС] 7
странно, вроде бы пробовал и
C++
1
        for( auto &&aa : a )
и
C++
1
        for( auto &aa : a )
и не изменялся a, а теперь и так и так работает
0
techpriest
633 / 212 / 57
Регистрация: 27.02.2014
Сообщений: 1,174
04.04.2017, 15:45 8
А вы учитываете, что
C++
1
pair<char, int>&& aa
и
C++
1
auto&& aa
это разные вещи?
0
131 / 130 / 64
Регистрация: 11.11.2010
Сообщений: 807
Записей в блоге: 14
04.04.2017, 15:52  [ТС] 9
то есть из
C++
1
auto&& aa
он выводит
C++
1
pair<const char, int>&& aa
который к
C++
1
pair<char, int>&&
не приводится, и отсюда создаётся копия, которая уже на a не указывает?
0
techpriest
633 / 212 / 57
Регистрация: 27.02.2014
Сообщений: 1,174
04.04.2017, 15:57 10
Я боюсь, что из
C++
1
auto&& aa
выводится вообще
C++
1
pair<const char, int>& aa
Но я недостаточно компетентен, чтобы прояснить эту ситуацию.

Думаю нам стоит подождать комментарий кого-то более прошаренного .
0
Форумчанин
Эксперт CЭксперт С++
8157 / 5005 / 1436
Регистрация: 29.11.2010
Сообщений: 13,458
04.04.2017, 16:02 11
Так легко проверить же через сравнение typeid.
Цитата Сообщение от GoldenId Посмотреть сообщение
не приводится
приводится

Добавлено через 51 секунду
Цитата Сообщение от GoldenId Посмотреть сообщение
а теперь и так и так работает
мув не удаляет объекты, он их оставляет в unspecified state.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.04.2017, 16:02

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Ошибка с типами данных в подпрограмме
Не знаю, правильно ли я задал названия темы, суть проблемы следующая: Нужно было создать программу...

Заполнить vector алгоритмом accumulate
В книге Скотта Майерса &quot;Эффиктивный STL&quot; рекомендовалось использовать алгоритмы вместо циклов. Из...

std::accumulate по столбцах двумерного массива
Есть массив: const int n = 10; int v; Как найти сумму элементов его столбца используя STL?

Одна ошибка в stl
не компилируется что не так? #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;vector&gt;...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.