【问题标题】:Is there a way to map an iterator to its container?有没有办法将迭代器映射到它的容器?
【发布时间】:2016-07-19 22:59:09
【问题描述】:

假设我有三个相同类型的向量 A、B 和 C,并且给我一个向量容器的迭代器,我如何找到它属于哪个容器? 谢谢

【问题讨论】:

    标签: c++ vector stl iterator


    【解决方案1】:

    你不能。您的设计已损坏,请重新考虑。

    迭代器的全部意义在于从容器(和其他数据集合)中抽象出来,你不能只是颠倒抽象。

    【讨论】:

    • 我知道(当然是在代码中测试之后)这是一个糟糕的设计选择。让我好奇的是,调试器能够从被比较的不同向量容器中检测迭代器,并让我认为可能有一种方法可以将迭代器映射回容器。所以我只是想知道是否有其他人知道这种技术.. 谢谢!
    • @user6386155 一个实现/调试器/我们。当然允许跟踪迭代器所属的范围,但一般来说,它是单向街道。
    【解决方案2】:

    严格回答你的问题,你可以这样检查:

    vector<T>::iterator it = ...;
    if (it >= A.begin() && it < A.end()) // it is in vector A
    if (it >= B.begin() && it < B.end()) // or in vector B
    if (it >= C.begin() && it < C.end()) // and here in vector C
    

    这仅适用于vector 使用随机访问迭代器,并且不适用于maplist 等大量其他容器。正如@Baum mit Augen 所说,您应该重新设计以避免这种情况。也许您应该将对所需向量的引用与迭代器一起传递?

    【讨论】:

    • 一个问题是当你改变一个向量时,你可能持有无效的迭代器
    • 更直接的问题是比较来自不同容器的迭代器会调用未定义的行为。所以这实际上是不合法的。 (虽然可能会起作用,但从未尝试过。)
    • Fwiw。 libstdc++ 的调试模式确实会抱怨。 (理所当然。)coliru.stacked-crooked.com/a/36d6c1107be7b54f
    • @BaummitAugen 这也是 UB 吗? std::cout &lt;&lt; std::less&lt;decltype(&amp;*it)&gt;()(&amp;*it, &amp;*begin(b));
    • @SCFrench 是的,std::less 调用 operator&lt; 除非是专门的,这里不是这种情况。因此,再次比较的两个迭代器必须是“相同范围”的有效迭代器。 (有关其技术定义,请查找“可达”)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    • 2017-01-30
    • 1970-01-01
    • 2021-09-13
    相关资源
    最近更新 更多