std::map C++ 中的迭代器初始化为零
std::map iterator initialization by zero in C++
我需要用零值初始化一个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 下编译。错误是:
error C2440: '' : 无法从 'int' 转换为 'std::_Tree_iterator>>> 没有构造函数可以采用源类型,或者构造函数重载解析不明确。
能否告诉我如何将迭代器的初始化转换为零或重新措辞?
谢谢
PS
主要思想是在 "list"
末尾获取 NULL
(it = a.begin(); it != a.end(); it = it->next)
基于来自不同地图对象的 map::iterators。
a::end() {
return std::map<K, V>::iterator(0)
}
不,你没有。
您需要使用 past-the-end 值(您只能从它应该迭代的容器中获取)进行初始化:
return map.end();
或最坏情况 默认值 值:
return std::map<int, int>::iterator();
不同的是,前者可以测试是否是end 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 下编译。错误是: error C2440: '' : 无法从 'int' 转换为 'std::_Tree_iterator>>> 没有构造函数可以采用源类型,或者构造函数重载解析不明确。
能否告诉我如何将迭代器的初始化转换为零或重新措辞?
谢谢
PS
主要思想是在 "list"
末尾获取 NULL(it = a.begin(); it != a.end(); it = it->next)
基于来自不同地图对象的 map::iterators。
a::end() {
return std::map<K, V>::iterator(0)
}
不,你没有。
您需要使用 past-the-end 值(您只能从它应该迭代的容器中获取)进行初始化:
return map.end();
或最坏情况 默认值 值:
return std::map<int, int>::iterator();
不同的是,前者可以测试是否是end iterator,而后者基本不能碰。如果你做后者,你基本上要记住不要碰它。您甚至无法比较默认构造的迭代器是否相等以检查它们是否是默认构造的(大多数实现定义了比较,但有些可能没有)。