虽说使用stl已经很熟练了,但还是经常要犯这样那样的一些小错误。看下我的这个错误吧。
我有一个list,一个map,list里包含了一些人的个人资料,姓名啦(假定姓名是唯一的),年龄啊。由于某种原因,姓名的值可能为空的。
现在有一个需求:要求提供一个姓名,能迅速找到这个人的资料。根据这些要求,我就很自然的使用了一个map,
map的key是姓名,value是这个姓名在list里的iterator值,因此当我新添加一个人时,很自然的将这个新人的资料添加到
list的最后,因此最开始的代码入下:
people_list.push_back(Item(_T("dikatour"), 23, _T("zhejiang province")));
people_map.insert(Map_t::value(_T("dikatour"), people_list.rbegin().base());
这里我的逻辑是:rbegin()是最后一个元素,而base是这个reverse_iterator对应的正序的那个iterator,应该也是指向最后那个元素
的iterator吧。运行结果是直接崩溃,因为rbegin()对应的正序的iterator是end(),是最后那个元素的后一个元素!也就是说reverse_iterator
与正序的iterator相比,正序的iterator的位置比reverse_iterator的位置多一。
明白这一点后,我修改了代码:
people_map.insert(Map_t::value(_T("dikatour"), people_list.end()--);
还是崩溃了,因为people_list.end()--表达式先计算people_list.end(),就当做参数的值交给了insert函数,而一直
到insert函数返回后才执行后面的--操作,实在粗心啊!正式的写法应该是:
people_map.insert(Map_t::value(_T("dikatour"), --people_list.end());
---------------------------------------------------------------------------------------------------------
笔记:
std::list是双链表,它的iterator是bidirectional iterator.它的迭代器有能力顺序的递增,递减,但不能像vector那样
随机地递增活递减,也就是说它支持operator++, operator--, 但不支持operator+和operator-
我有一个list,一个map,list里包含了一些人的个人资料,姓名啦(假定姓名是唯一的),年龄啊。由于某种原因,姓名的值可能为空的。
现在有一个需求:要求提供一个姓名,能迅速找到这个人的资料。根据这些要求,我就很自然的使用了一个map,
map的key是姓名,value是这个姓名在list里的iterator值,因此当我新添加一个人时,很自然的将这个新人的资料添加到
list的最后,因此最开始的代码入下:
people_list.push_back(Item(_T("dikatour"), 23, _T("zhejiang province")));
people_map.insert(Map_t::value(_T("dikatour"), people_list.rbegin().base());
这里我的逻辑是:rbegin()是最后一个元素,而base是这个reverse_iterator对应的正序的那个iterator,应该也是指向最后那个元素
的iterator吧。运行结果是直接崩溃,因为rbegin()对应的正序的iterator是end(),是最后那个元素的后一个元素!也就是说reverse_iterator
与正序的iterator相比,正序的iterator的位置比reverse_iterator的位置多一。
明白这一点后,我修改了代码:
people_map.insert(Map_t::value(_T("dikatour"), people_list.end()--);
还是崩溃了,因为people_list.end()--表达式先计算people_list.end(),就当做参数的值交给了insert函数,而一直
到insert函数返回后才执行后面的--操作,实在粗心啊!正式的写法应该是:
people_map.insert(Map_t::value(_T("dikatour"), --people_list.end());
---------------------------------------------------------------------------------------------------------
笔记:
std::list是双链表,它的iterator是bidirectional iterator.它的迭代器有能力顺序的递增,递减,但不能像vector那样
随机地递增活递减,也就是说它支持operator++, operator--, 但不支持operator+和operator-