迭代器的STL容器的行为
How does an STL container of iterators behave?
这个问题在我看来是出于学术兴趣,而不是实际的用例:
STL关联容器,即[多]集和[多]映射,包含重载方法,如:
// for std::map
void erase ( iterator position );
size_type erase ( const key_type& x );
// for std::set
iterator erase (const_iterator position);
size_type erase (const value_type& val);
我的问题是:如果key_type
,分别。value_type
是iterator
还是const_iterator
我知道将迭代器存储在容器中是危险的,而且可能毫无用处。但是实际的STL实现会如何表现呢?行为是否有定义?
问题是迭代器类型会有所不同。他们不可能是一样的。原因:在这种情况下,以下等式必须成立:
map<K, V>::iterator == K
map<K, V>::const_iterator == K
然而,这些等式不成立(你看到递归了吗(?请记住,迭代器类型取决于容器类型,包括其模板参数。
因此,在下面的例子中,键类型和迭代器类型是不同的,只要你试图使它们相等:
map<map<int,int>::iterator, int> i;
事实上,由于上面的原因,我无法实例化一个键等于其迭代器类型的映射。因此,过载的erase
方法如下所示:
void erase ( map<map<int,int>::iterator, int>::iterator position );
size_type erase ( const map<int,int>::iterator & x );
因此,过载永远不会含糊不清。如果类型相等,则会出现歧义,请参见以下内容:http://ideone.com/fMdwru.但是,编译器只会在您使用该方法时发出抱怨。所以,假设我们可以在这里引入模糊性,只要我们想使用该方法,它就会困扰我们。我的意思是,我们仍然可以实例化映射类型(如果存在的话(。
在容器中存储迭代器本身没有什么问题。需要注意的两个主要问题是:
- 您可能需要知道每个迭代器引用的是哪个容器
- 您必须知道原始容器上的哪些操作会使哪些迭代器无效
我的问题是:如果
key_type
。value_type
是iterator
还是const_iterator
?
如果所有四种类型都引用相同的容器类型,那么根据定义,答案是它们不可能是相同的。
这样做没有错,也没有什么用处。:(
请记住,迭代器基本上只是广义指针。当有疑问时,假设它们的行为像指针。您可以创建指针的容器,因此也可以创建迭代器的容器。
当然,您必须记住,如果修改容器,指向该容器的迭代器可能会无效(取决于执行的操作和容器的类型(,但这只意味着您必须知道存储的迭代程序仍然有效。
- 成员函数不能为集合迭代器和const_iterator的输入重载(但可以为其他 STL 迭代器重载)
- C++如何获取传递给函数(STL 迭代器)的参数的名称
- 如何将 stl 迭代器与特征一起使用?
- 用于 STL 迭代器、指针和 std::nullptr_t 的模板函数
- STL 迭代器继承:"value_type"不命名类型
- 错误试图实现STL迭代器
- 使用 stl 迭代器封装向量是否很好?如果是?怎么可能呢?
- 如何断言模板参数的类型 STL 迭代器类型
- 带有原始指针的stl::迭代器
- STL 迭代器:断言错误
- 多态性中的通用STL迭代器
- 使用STL迭代器的两个循环
- 如何在c++中对stl迭代器进行平均运算
- 如何使用STL迭代器和reverse_iterator处理数据
- DEV-C++5.11 STL迭代器的调试问题
- std::map::begin() 之前的 STL 迭代器
- 我是否可以轻松覆盖 (STL) 迭代器的类别?
- 如何使用 STL 迭代器处理结构
- STL 迭代器和数组的关系
- 使用c++stl迭代器而不是传统指针的正确方法是什么