2016-04-08 100 views
0

我有以下類型:如何訪問std :: vector迭代器中的std :: map屬性?

typedef std::map<std::string, double> Tick; 

和向量​​:

std::vector<Tick> dataSegment; 

我想通過向量來迭代和計算每個地圖項的特定屬性的總和:

double sum = 0.0; 

for (std::vector<Tick>::iterator iterator = dataSegment.begin(); iterator != dataSegment.end(); ++iterator) { 
    sum += iterator->find("close"); 
} 

但是,當我這樣做時,出現以下錯誤:

error: invalid operands to binary expression ('double' and 'iterator' (aka '__map_iterator<__tree_iterator, double>, std::__1::__tree_node, double>, void *> *, long> >')) sum += iterator->find("close");

我也試過:

for (std::vector<Tick>::iterator iterator = dataSegment.begin(); iterator != dataSegment.end(); ++iterator) { 
    sum += (*iterator).find("close"); 
} 

但這會產生類似的錯誤:

invalid operands to binary expression ('double' and 'iterator' (aka '__map_iterator<__tree_iterator, double>, std::__1::__tree_node, double>, void *> *, long> >')) sum += (*iterator).find("close");

+0

'sf :: map :: find'返回一個迭代器,而不是一個值。 – Hiura

+0

啊!這是真的,看文檔。我如何訪問一個屬性? –

+1

通過推論。 – Hiura

回答

2

std::map::find返回迭代器。如果你想使用,你必須首先檢查它:

auto mit = iterator->find("close"); 
if (mit != iterator->end()) { 
    sum += mit->second; 
} 

在另一方面,你可以使用operator[],而不是(這將默認插入到地圖,如果關鍵是沒有找到):

sum += (*iterator)["close"]; 
+0

不錯! '(* iterator)[「close」]'做了訣竅。謝謝! –

+1

如果未找到,at(const Key&key)方法將不會插入新項目。它會拋出'std :: out_of_range' http://en.cppreference.com/w/cpp/container/map/at(C++ 11及以上版本) – Ceros

+0

使用'.at()'的好的調用。我會嘗試使用它。 –

相關問題