std :: map迭代器在C ++中初始化为零

时间:2015-01-07 10:49:41

标签: c++ iterator

我需要用零值初始化一个interator。我尝试了以下代码

#include <map>
std::map<int, int>::iterator foo() {
    std::map<int, int>::iterator ret;
    ret = std::map<int, int>::iterator(0);
    return ret;
}

它在Linux上由gcc和intel C ++编译器成功编译。此外,这在Windows上的minGW中编译得很好。提供-O2的代码是

xorl eax, eax
ret

问题是VisualStudio下的编译。错误是: 错误C2440:'':无法从'int'转换为'std :: _ Tree_iterator&gt;&gt;&gt;没有构造函数可以采用源类型,或者构造函数重载解析是不明确的。

您能否告诉我如何对迭代器进行零或重新初始化?

谢谢

PS

主要思想是在“list”

的末尾获取NULL
  

(it = a.begin(); it!= a.end(); it = it-&gt; next)

基于来自不同地图对象的map :: iterators。

a::end() {
    return std::map<K, V>::iterator(0)
}

1 个答案:

答案 0 :(得分:4)

不,你没有。

您需要使用 past-the-end 值进行初始化(您只能从应该迭代的容器中获取):

return map.end();

或最坏情况下默认值:

return std::map<int, int>::iterator();

不同之处在于前者可以测试它是否是结束迭代器,而后者基本上是不可触及的。如果你这样做,你基本上必须记住不要碰它。你甚至不能比较默认构造的迭代器的相等性来检查它们是否是默认构造的(大多数实现定义了比较,但有些可能没有)。