2014-02-08 1 views
1

Я не могу получить этот довольно простой код для компиляции. Я получаю ошибку, could not deduce template argument for 'std::basic_string<_Elem,_Traits,_Alloc> &&' from 'int'. Нужно ли мне передавать какую-то пользовательскую функцию суммирования для накопления? Или, может быть, есть более простой способ получить сумму всех вторых значений на карте? Благодаря!Накопить на карте

#include <iostream> 
#include <math.h> 
#include <map> 
#include <numeric> 


int main() 
{ 

map<int, int> m; 

m[1] = 1; 
m[2] = -1; 
m[3] = 1; 
m[4] = 2; 

int sum = accumulate(m.begin(), m.end(), 0); 
cout << sum; 

return 0; 
} 

ответ

2

Вы не можете использовать алгоритм зОго :: accuulate в простой форме для контейнера типа станда :: карта. Вам нужно использовать алгоритм с двоичной операцией и использовать, возможно, лямбда-выражение в качестве двоичной операции. Например,

int sum = accumulate(m.begin(), m.end(), 0, 
         [](int acc, std::pair<int, int> p) { return (acc + p.second); }); 
1

std::map<int, int> содержит std::pair<const int, int> элементы. std::accumulate не знает, что с ними делать. Но вы можете решить эту проблему, передав ей подходящий функтор. Например, накапливать ключи:

int fun(int i, const std::pair<const int, int>& rhs) 
{ 
    return i + rhs.second; 
} 
int sum = accumulate(m.begin(), m.end(), 0, fun); 

Примечание вы можете упростить это с помощью лямбда, если вам не нужно использовать fun в другом месте:

int sum = accumulate(m.begin(), m.end(), 
        [](int i, const std::pair<const int, int>& rhs) 
        { 
         return i + rhs.second; 
        }); 
+0

Эта подпись неправильная. – jrok

+0

Это std :: pair

+0

@jrok Спасибо, я исправлял это. – juanchopanza

1

типа Элемент std::map<K,V> является std::pair<const K,V> для которых operator+ не определен. Вы должны использовать 4 аргумента версию accumulate и поставить свою собственную операцию сложения:

typedef std::pair<int, int> Pair; 

int sum = accumulate(m.begin(), m.end(), 0, 
    [](int i, Pair p){ return i + p.second; }); 
+0

Это std :: pair - но это не имеет значения здесь –

+0

@ DieterLücking Исправлено в любом случае, спасибо. – jrok

+0

Как вы исправились, дорогой jrok, дорогой jrok? – Yakk