2016-04-08 98 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()'的好的调用。我会尝试使用它。 –

相关问题