[英]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
,resp。 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
,resp。value_type
是iterator
还是const_iterator
?
如果所有四种类型都引用相同的容器类型,则答案是根据定义它们不能相同。
这样做没有错,也没用。 :)
记住迭代器基本上只是泛化指针。 如有疑问,请假设它们的行为类似于指针。 您可以创建指针容器,因此您也可以创建迭代器容器。
当然,您必须记住,如果您修改容器,指向该容器的迭代器可能会失效(取决于执行的操作和容器的类型),但这只是意味着您必须知道存储的迭代器保持不变有效。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.