2015-07-21 2 views
1

У меня есть вектор пар int, и я хочу добавить все первые элементы каждой пары. Я написал следующий кодC++ добавление элементов списка пар

#include <iostream> 
#include <numeric> 
#include <vector> 
#include <utility> 

#define PII pair<int,int> 
using namespace std; 

int main() { 
    vector<pair<int,int>> v; 
    v.push_back(PII(1,2)); 
    v.push_back(PII(3,4)); 
    v.push_back(PII(5,6)); 
    cout<<accumulate(v.begin(),v.end(),0,[](auto &a, auto &b){return a.first+b.first;}); 
    return 0; 
} 

Здесь он дает ошибку http://ideone.com/Kf2i7d. Требуемый ответ: 1 + 3 + 5 = 9. Я не могу понять ошибки, которые он дает.

+6

Я перестал читать в '# define', почему бы не использовать' typedef' вместо этого? –

+0

Или 'using PII = std :: pair ;' поскольку это C++ 11. – TartanLlama

ответ

6

В этом вызове алгоритма

cout<<accumulate(v.begin(),v.end(),0,[](auto &a, auto &b){return a.first+b.first;}); 

его третий параметр инициализируется на 0 и, следовательно, вывел тип int.

Он соответствует аккумулятору алгоритма, который накапливает значения, которые подчиняются второму параметру лямбда-выражения.

Таким образом, вы должны написать

cout<<accumulate(v.begin(),v.end(),0,[](auto &a, auto &b){return a + b.first;}); 

Как для меня, я бы инициализировать его с целыми буквального типа long long int. Например

cout<<accumulate(v.begin(),v.end(),0ll,[](auto &a, auto &b){return a +b.first;}); 
2

std::accumulate перебирает каждый элемент и вызывает функцию подаваемой с текущим элементом и текущим значением аккумулятора.

Аккумулятор имеет тип int, а не pair<int, int>, поэтому вам необходимо исправить вашу лямбда-функцию, чтобы принять правильные типы аргументов.

Смежные вопросы