代码之家  ›  专栏  ›  技术社区  ›  Tom Smith

查找STL迭代器的所有者

  •  6
  • Tom Smith  · 技术社区  · 17 年前

    有没有办法找到迭代器指向的容器?具体来说,我希望能够找到 std::vector 由特定的人指出的 std::vector::iterator 这样我就可以检查范围,而不必实际传递对向量的引用。

    如果(我怀疑)答案是否定的,为什么不呢?

    编辑:感谢您提供了许多快速且(基本上)准确的答案。 Evan Teran 钉死它。我根本没有考虑优化,但现在很明显。

    vector::iterator s直接指向此对象(这听起来很奇怪,但在特定情况下确实有意义)。但这一点都不重要。

    7 回复  |  直到 7 年前
        1
  •  8
  •   Lightness Races in Orbit    7 年前

        2
  •  5
  •   Johannes Schaub - litb    17 年前

    没有办法做到这一点。原因很简单:向迭代器添加一种方法来获取它们所指向的容器是非常困难的

    • 无意义的迭代器对集合进行迭代。正如另一个人所说,只有这一点,没有更多。
    • 与迭代器要求不兼容。请记住,指针是一个随机访问迭代器。将容器指针放入迭代器对算法没有任何用处,因为它们是通用的,与特定迭代器实现分离。用作迭代器的指针不能具有指向作为成员从中获取的数组的指针。

    你说你需要它来检查射程。您可以提供一个结束迭代器,该迭代器指向范围的最后一个有效迭代器位置之后的一个。检查您当前的位置是否不在末尾。这就是范围检查所需要做的全部工作。

        3
  •  3
  •   Judge Maygarden    17 年前

    #include <algorithm>
    #include <cstdio>
    #include <cstring>
    
    int
    main(int argc, char *argv[])
    {
            const char s[] = "Hello, world!";
            const char *begin = s;
            const char *end = s + strlen(s);
    
            std::for_each(begin, end, putchar);
    
            return 0;
    }
    

    如何从指针中检索原始字符串(如果它没有指向字符串的开头)?

    implement 您自己的迭代器包装器,用于存储对容器的引用。

        4
  •  2
  •   Thomas Kammeyer    17 年前

    理论上,如果所讨论的迭代器至少是一个前向迭代器,那么有一种方法。您可以检查您的迭代器是否是每个候选容器的[first,last]中的迭代器之一。因为您使用的是向量容器,所以您有一个随机访问迭代器,您可以使用小于运算符快速执行此检查。

    你必须知道所有的候选向量,在前面检查, 这不是获取迭代器所属容器的一般方法。

    但是,您可以通过使用包含指向创建向量的指针的内容来装饰随机访问迭代器,从而定义随机访问迭代器的扩展。这可能有点不雅观、低效和不方便。所以,首先看看是否可以重写代码以避免这种需要。

        5
  •  1
  •   Drew Dormann    17 年前

    STL不允许这样做。

    例如,向量迭代器可以简单地实现为指针。并且没有通用的方法从指向对象分配的某些数据的指针检索对象。

        6
  •  0
  •   jdmichal    17 年前

    迭代器旨在对集合进行迭代,因此,迭代器提供了执行该操作所需的接口,并且仅提供了该接口。这是很好的面向对象编程原则。

    我可以问一下您的用例是什么,您需要知道迭代器容器的“范围”吗?

        7
  •  0
  •   Tamara Wijsman    17 年前

    如前所述,最好重写代码,这样就不需要这种行为。这和拿着一枚硬币是一样的,但是你不知道它来自哪里,除非你在纸上记下它。

    如果无法重写代码,仍然可以引入一个包装对象,该对象包含指向容器和迭代器本身的指针。你需要这个做什么?