【发布时间】:2013-01-13 13:45:04
【问题描述】:
在 C++ 中给定一个特定的 stl 集合,end() 值对于相同模板化的所有实例是否等效?换句话说,以下内容是否适用于所有 stl 容器和环境(不仅适用于 std::map)?
std::map<Key, Value> foo(int seed);
std::map<Key, Value> instance1 = foo(1);
std::map<Key, Value> instance2 = foo(2);
std::map<Key, Value>::iterator itr = instance1.begin();
std::map<Key, Value>::iterator endItr = instance2.end(); // Comes from other collection!
for (; itr != endItr; ++itr) {
// Do something on each key value pair...
}
【问题讨论】:
-
可能在特定的实现中工作,但您只能将其计入使用默认 ctor 创建“结束”迭代器的类型(例如,
std::istream_iterator)。即使在这些情况下,也没有什么可以直接保证。 -
如果这行得通,请认为自己不走运。这显然是您的代码中的一个错误。我认为 MSVC 会检测到这种类型的迭代器误用,但也许这只是检查过的迭代器。
-
@SteveTownsend:我认为这可以保证在 MSVC 上工作,因为它们实现了SCARY iterators。
-
@Jesse:不完全是。 SCARY 迭代器允许您混合迭代器类型,而不管比较器/分配器类型如何,因此
std::map<K,V>::iterator与std::map<K,V, custom_compare>::iterator的类型相同,但这并不意味着来自两个映射的结束迭代器具有相同的值。跨度> -
@DaveS:啊,对,SCARY 迭代器只讨论类型等价而不是值等价。谢谢指正。
标签: c++ stl iterator containers language-lawyer