C++ 迭代器的STL容器是如何工作的?
在我看来,这个问题似乎是出于学术兴趣而非实际用例: STL关联容器,即[multi]集合和[multi]映射,包含重载方法,如:C++ 迭代器的STL容器是如何工作的?,c++,stl,C++,Stl,在我看来,这个问题似乎是出于学术兴趣而非实际用例: STL关联容器,即[multi]集合和[multi]映射,包含重载方法,如: // 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_typ
// 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);
我的问题:如果键类型
,分别<代码>值类型是迭代器
或常量迭代器
?
我知道将迭代器存储在容器中是危险的,而且可能是无用的。但是,实际的STL实现将如何运行呢?是否定义了该行为?在容器中存储迭代器本身并没有什么问题。需要注意的两个主要问题是:
键类型
,分别<代码>值类型是迭代器
还是常量迭代器
如果这四种类型都引用相同的容器类型,那么答案是根据定义,它们不可能是相同的。问题是迭代器类型会不同。他们不可能是一样的。原因:在这种情况下,必须保持以下等式:
map<K, V>::iterator == K
map<K, V>::const_iterator == K
因此,过载永远不会含糊不清。如果类型相同,则不明确,请参见以下内容:。但是,编译器只会在您使用该方法时发出抱怨。所以,假设我们可以在这里引入歧义,它只会困扰我们,只要我们想使用这种方法。我的意思是,我们仍然可以实例化映射类型(如果它存在的话)。这样做没有错,也没有什么用处。:) 请记住,迭代器基本上只是广义指针。当有疑问时,假设它们的行为像指针。您可以创建指针容器,也可以创建迭代器容器
当然,您必须记住,如果您修改一个容器,指向该容器的迭代器可能会失效(取决于执行的操作和容器的类型),但这只是意味着您必须知道存储的迭代器保持有效。存储迭代器并非无用。@leems:grmph。。。不它是在午餐时出现的。。。尝试一下可能是合理的。但这仍然留下了一个问题:我得到的任何行为是故意的还是随机的。真的。。。但我想指出的是,我并不关心实际使用这个结构。@steffen你不能尝试,我只是意识到:)所以我删除了这个评论,因为它没有任何意义。[@all others:我写了“你试过了吗?”]虽然将迭代器存储在容器中是完全合理的,但为自己创建一个迭代器容器可能是一个完全不同的问题(如果可能的话),只有在那些函数定义出现问题的时候,才会出现问题。仍然没有以任何方式解决实际问题,是吗?@ChristianRau如果我不这么认为的话,我就不会发了。你觉得它没有解决什么问题?好吧,如果在容器中存储迭代器有效,它回答了一般问题,但这只是实际问题的副产品,如果
key/value\u type
=(const)迭代器(iterator)
,这就是创建一个自身带有迭代器的映射的更为特殊的问题。@ChristianRau:也许我误解了这个问题。我只是把它看作是一个关于在容器中存储迭代器的问题——而不是将迭代器存储到容器本身(这是不可能做到的)
map<map<int,int>::iterator, int> i;
void erase ( map<map<int,int>::iterator, int>::iterator position );
size_type erase ( const map<int,int>::iterator & x );