迭代器的STL容器如何表现?

ste*_*fen 3 c++ stl

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

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);
Run Code Online (Sandbox Code Playgroud)

我的问题:如果key_type,等等.value_typeiteratorconst_iterator

我知道将迭代器存储在容器中是危险的并且可能没用.但是实际的STL实现会如何表现?行为甚至定义了吗?

lee*_*mes 10

问题是迭代器类型会有所不同.不可能它们是相同的.原因是:在这种情况下必须遵循以下平等:

map<K, V>::iterator == K
map<K, V>::const_iterator == K
Run Code Online (Sandbox Code Playgroud)

但是,这些等式无法保持(你看到递归)吗?请记住,迭代器类型取决于容器类型,包括其模板参数.

因此,在下面的示例中,键类型和迭代器类型是不同的,只要您尝试使它们相等:

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

实际上,由于上​​面的原因,我无法实例化一个键等于其迭代器类型的映射.因此,重载erase方法如下所示:

void erase ( map<map<int,int>::iterator, int>::iterator position );
size_type erase ( const map<int,int>::iterator & x );
Run Code Online (Sandbox Code Playgroud)

因此,重载永远不会是模棱两可的.如果类型相同,那就不明确了,请看:http://ideone.com/fMdwru.但是,只要您使用该方法,编译器就会抱怨.所以,假设我们可以在这里引入歧义,只要我们想要使用该方法,它只会困扰我们.我的意思是,我们仍然可以实例化地图类型(如果它存在).


NPE*_*NPE 6

将迭代器存储在容器中没有任何内在错误.需要注意的两个主要问题是:

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

我的问题:如果key_type,等等.value_typeiteratorconst_iterator

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