2010-06-24 100 views
1

我有多重映射通過多重映射累積值

typedef std::pair<int, int> comp_buf_pair; //pair<comp_t, dij> 
typedef std::pair<int, comp_buf_pair> node_buf_pair; 
typedef std::multimap<int, comp_buf_pair> buf_map; //key=PE, value = pair<comp_t, dij> 
typedef buf_map::iterator It_buf; 
int summ (int x, int y) {return x+y;} 


int total_buf_size = 0; 
std::cout << "\nUpdated buffer values" << std::endl; 
for(It_buf it = bufsz_map.begin(); it!= bufsz_map.end(); ++it) 
{ 
    comp_buf_pair it1 = it->second; 
    // max buffer size will be summ(it1.second) 
    //total_buf_size = std::accumulate(bufsz_map.begin(), bufsz_map.end(), &summ); //error?? 
    std::cout << "Total buffers required for this config = " << total_buf_size << std::endl; 
    std::cout << it->first << " : " << it1.first << " : " << it1.second << std::endl; 

} 

定義我想總結的it1.second 指向的所有值如何能的std ::累積函數訪問第二個迭代器值?

+1

嗨,如果你正在迭代它們,爲什麼不把它添加到你的循環? 'total_buf_size + = it1.second;' – nus 2010-06-24 17:24:30

+1

您在it1.second中的「所有值」是什麼意思? It1.second只是一個int。它只有價值。 – 2010-06-24 17:39:58

+0

@ufotds有時候最簡單的一步就是解決問題。我使用了你提到的'total_buf_size + = it1.second;'。我試圖使用基於STL示例的向量容器進行累加的方式。另外我試圖避免在容器中循環。 – vivekv80 2010-06-24 18:04:41

回答

2

你的問題是與summ功能,你實際上需要更好的東西比能夠處理2個不匹配的類型。

如果你幸運的話,這可能是工作:

int summ(int x, buf_map::value_type const& v) { return x + v.second; } 

如果你運氣不好(取決於accumulate是如何實現的),你總是可以:

struct Summer 
{ 
    typedef buf_map::value_type const& s_type; 
    int operator()(int x, s_type v) const { return x + v.second.first; } 
    int operator()(s_type v, int x) const { return x + v.second.first; } 
}; 

然後使用:

int result = std::accumulate(map.begin(), map.end(), 0, Summer()); 
+0

我不明白,'accumulator'不會使用'buf_map'而不是'buf_map.value_type'來調用函數嗎? – nus 2010-06-24 17:43:42

+0

ahh代碼如何在評論中突出顯示?哼。 – vivekv80 2010-06-24 18:15:26

+0

@ vivekv80:反引號,但我不知道它是否適用於長序列。 – 2010-06-25 06:22:58

1

我想你只需要改變你的summ函數來取代map_type_type。這完全沒有經過測試,但它應該給出這個想法。

int summ (int x, const buf_map::value_type& y) 
{ 
    return x + y.second; 
} 

並調用它:

total_buf_size = std::accumulate(bufsz_map.begin(), bufsz_map.end(), 0, &summ);

+0

不起作用,因爲初始化程序是一個'int',而'summ'在這裏不需要'int'作爲參數。 – 2010-06-24 17:31:21

+0

我認爲它實際上需要一個buf_map,並且返回一個臨時buf_map,第二個被設置爲總和才能工作。請參閱:http://www.cplusplus.com/reference/std/numeric/accumulate/ – nus 2010-06-24 17:35:01

0

Accumulate是求和的概括:它計算的init該範圍內的總和(或一些其它的二進制運算),並且所有的元素的[first, last)

...結果首先被初始化爲init。然後,對於每個迭代器i[first, last)中,按照從頭到尾的順序,它由result = result + *i(在第一個版本中)或result = binary_op(result, *i)(在第二個版本中)更新。

Sgi.com

你嘗試既不是第一個或第二個版本,你錯過了初始化部分

total_buf_size = std::accumulate(bufsz_map.begin(), bufsz_map.end(), 0, &summ); 
0

你爲什麼招惹含有對對?這太複雜了,你會失敗。爲什麼不定義一個結構?

+1

這不會解決問題...但無論如何,我想。 – 2010-06-24 17:32:56