2013-02-15 34 views
5

矢量获得价值为什么会在对的向量的迭代器访问对的值时,下面的错误?错误从双

vector< pair<int,string> > mapper; 
if(Hash(input, chordSize) != id){ 
    mapper.push_back(make_pair(tmp, input)); 
} 

for (vector< pair<int,string> >::iterator it = mapper.begin(); it != mapper.end(); ++it) 
{ 
    cout << "1st: " << *it.first << " "   // <-- error! 
     << "2nd: " << *it.second << endl;  // <-- error! 
} 

错误消息:

main_v10.cpp:165:25: error: ‘std::vector > >::iterator’ has no member named ‘first’ main_v10.cpp:165:56: error: ‘std::vector > >::iterator’ has no member named ‘second’

我该如何解决这个问题?

+1

您可能想要读取运算符优先级,签出'*'和'.'优先权: http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B – billz 2013-02-15 07:58:52

回答

7

这是适用于三分球,太(迭代器的行为很像指针)的问题。有访问一个部件的值的指针(或迭代)指向两种方式:

it->first  // preferred syntax: access member of the pointed-to object 

(*it).first // verbose syntax: dereference the pointer, access member on it 

的算符优先将您的表达成

*(it.first) // wrong! tries to access a member of the pointer (iterator) itself 

其尝试访问迭代器本身,它失败的成员first,因为它没有一个成员叫first。如果确实如此,那么您将取消该成员的价值。


但是,在大多数情况下,您应该使用std::map从键映射到值。取而代之的vector<pair<int,string> >,你应该使用map<int,string>其行为类似于(插入,重复和东西也正好与对),但排序以更快的随机访问的数据结构中的键:

map<int,string> mapper; 
if(Hash(input, chordSize) != id){ 
    mapper.push_back(make_pair(tmp, input)); 
} 

for (map<int,string>::iterator it = mapper.begin(); it != mapper.end(); ++it) 
{ 
    cout << "1st: " << it->first << " " 
     << "2nd: " << it->second << endl; 
} 

注意之间的本质区别映射和对的向量是映射通过按键排列元素来重新排列元素。之后无法查询插入的顺序。有些情况下,你不想做的案件(当插入顺序问题),所以在这种情况下,无论您的解决方案或至少含有键和值自定义类型的载体是正确的解决方案。

+0

我认为第二个变体应该是'(*它).first' – 2013-02-15 07:43:36

+0

@ G-makulik当然,谢谢。 – leemes 2013-02-15 07:43:53

+0

是的,第二种选择是正确的!谢谢。你真棒! – 2013-02-15 07:49:31