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

shs*_*_sf -1 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;
}
Run Code Online (Sandbox Code Playgroud)

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

xorl eax, eax
ret
Run Code Online (Sandbox Code Playgroud)

问题是在 VisualStudio 下编译。错误是: error C2440: '' : cannot convert from 'int' to 'std::_Tree_iterator>>> 没有构造函数可以采用源类型,或者构造函数重载解析不明确。

您能否给我一个想法如何将迭代器的初始化设置为零或重新措辞?

谢谢

聚苯乙烯

主要思想是在“列表”的末尾获取 NULL

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

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

a::end() {
    return std::map<K, V>::iterator(0)
}
Run Code Online (Sandbox Code Playgroud)

Jan*_*dec 5

不,你没有。

您需要使用最后的值进行初始化(您只能从它应该迭代的容器中获取):

return map.end();
Run Code Online (Sandbox Code Playgroud)

或者在最坏的情况下使用默认值:

return std::map<int, int>::iterator();
Run Code Online (Sandbox Code Playgroud)

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