Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 迭代器的STL容器是如何工作的?_C++_Stl - Fatal编程技术网

C++ 迭代器的STL容器是如何工作的?

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

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

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_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 );