迭代器的STL容器的行为

How does an STL container of iterators behave?

本文关键字:STL 迭代器      更新时间:2023-10-16

这个问题在我看来是出于学术兴趣,而不是实际的用例:

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_typeiterator还是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.但是,编译器只会在您使用该方法时发出抱怨。所以,假设我们可以在这里引入模糊性,只要我们想使用该方法,它就会困扰我们。我的意思是,我们仍然可以实例化映射类型(如果存在的话(。

在容器中存储迭代器本身没有什么问题。需要注意的两个主要问题是:

  1. 您可能需要知道每个迭代器引用的是哪个容器
  2. 您必须知道原始容器上的哪些操作会使哪些迭代器无效

我的问题是:如果key_typevalue_typeiterator还是const_iterator

如果所有四种类型都引用相同的容器类型,那么根据定义,答案是它们不可能是相同的。

这样做没有错,也没有什么用处。:(

请记住,迭代器基本上只是广义指针。当有疑问时,假设它们的行为像指针。您可以创建指针的容器,因此也可以创建迭代器的容器。

当然,您必须记住,如果修改容器,指向该容器的迭代器可能会无效(取决于执行的操作和容器的类型(,但这只意味着您必须知道存储的迭代程序仍然有效。