2015-06-04 97 views
2

我想總結map的前四個元素,使用iterator,C++迭代器的地圖和元素

map<int, string> numbers; //making object of map 
numbers.insert(pair<int, string>(2,"two")); //inserting values into map 
numbers.insert(pair<int, string>(3,"two")); //inserting values into map 
numbers.insert(pair<int, string>(4,"two")); //inserting values into map 
numbers.insert(pair<int, string>(7,"two")); //inserting values into map 
numbers.insert(pair<int, string>(5,"two")); //inserting values into map 
map<int, string>::iterator it; 
it=numbers.begin(); 
for(;it!=numbers.begin()+4; it++){ //problem is here and in body 

} 
+0

你代碼招致大量的複製。從你的配對到地圖的'value_type'完全不必要的轉換。爲什麼不'numbers.emplace(2,「two」)'? –

+0

你有什麼*問題?只是說「問題在這裏」而不告訴我們問題是什麼,並不能告訴我們多少。你有構建錯誤嗎?運行時錯誤?意外的結果?問題是你不知道如何添加?你不知道這個循環是否正常?還有其他的東西嗎? –

回答

2

不要使用+作爲迭代器。它只對隨機訪問迭代器有意義,但沒有理由任意限制自己(事實上這意味着你的代碼不起作用,因爲映射迭代器不是隨機訪問的)。相反,使用由<iterator>提供的設施:

#include <cassert> 
#include <iterator> 

// ... 

assert(numbers.size() >= 4); 

for (auto it = numbers.begin(), e = std::next(it, 4); it != e; ++it) 
{       // ^^^^^^^^^^^^^^^^^^^^ 
    acc += it->first; 
} 

迭代器arithmators next/prev和所有迭代器advance的工作,他們在內部分派到最高效的操作。例如。 advance(it, n)對隨機訪問迭代器執行it += n,否則執行循環。

3

您可以使用std::accumulate<algorithm>頭:

std::accumulate(it, std::next(it,4), 0, 
       [](const auto& a, const auto& b){return a + b.first;}); 
0

帶着幾分C++ 11的,如果我理解你想總結一下,你可以這樣做:

std::map<int, std::string> numbers = { 
    {2,"two"}, 
    {3,"two"}, 
    {4,"two"}, 
    {7,"two"}, 
    {5,"two"} 
}; //Better initialisation 
std::string sum = ""; 

for(auto it = std::begin(numbers); it != std::next(std::begin(numbers),4); ++it) 
{ 
    sum += it->second; 
}