查找STL迭代器的所有者

时间:2008-12-17 18:46:41

标签: c++ stl iterator

有没有办法可以找到迭代器指向的容器?具体来说,我希望能够找到特定std::vector所指向的std::vector::iterator,以便我可以检查范围,而无需实际传递对该向量的引用。

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

编辑:感谢您提供一些快速且(大部分)准确的答案。 Evan Teran指甲。我根本没有考虑优化,但现在很明显。

有几个人问我想做什么。这没什么特别重要的。我有一个对象,它用向量和指向向量的迭代器初始化。如果我可以使用迭代器初始化对象,这将是可爱和方便的,因为我可以将vector::iterator直接转换为此对象(这听起来很奇怪,但在特定情况下确实有意义)。但它根本不重要。

7 个答案:

答案 0 :(得分:7)

我不相信。如果迭代器必须保持对它们自己的容器的引用/指针,那么就不可能将它们优化为轻量级指针(可以使用容器来保证连续存储,如矢量等)。

答案 1 :(得分:5)

没有办法让这项工作。原因很简单:为迭代器添加一种方法来获取它们指向的容器

  • 毫无意义的。迭代器遍历集合。正如其他人所说,仅此而已,仅此而已。
  • 与迭代器要求不兼容。记住指针是一个随机访问迭代器。将容器指针放入迭代器对算法没用,因为它们打算是通用的,与特定的迭代器实现分离。用作迭代器的指针不能指针指向作为成员的数组。

你说你需要它来进行范围检查。您可以提供一个结束迭代器,它指向一个范围的最后一个有效迭代器位置之后的一个。检查您当前的位置是否不在最后。这就是你需要做的范围检查。

答案 2 :(得分:3)

您无法以一般方式从迭代器中检索容器。作为原因的一个例子,普通指针可以用作迭代器:

#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围绕存储对容器的引用的迭代器自己的包装器。

答案 3 :(得分:2)

理论上,如果所讨论的迭代器至少是一个前向迭代器,那就有办法了。您可以检查您的迭代器是否是每个候选容器的[first,last]中的迭代器之一。由于您正在使用向量容器,因此您有一个随机访问迭代器,您可以使用less-than运算符来快速执行此检查。

你必须知道所有要检查的候选载体, 这不是获取迭代器所属容器的一般方法。

但是,您可以通过使用包含指向创建向量的指针的东西来装饰随机访问迭代器来定义随机访问迭代器的扩展。这可能略微不优雅,低效且不方便。所以看看你是否可以重写代码以避免这种需要。

答案 4 :(得分:1)

STL不允许这样做。

例如,

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

答案 5 :(得分:0)

我不相信有一种暴露的方法可以做到这一点。原因是,这不是迭代器的目的。当然,没有技术原因,迭代器无法保存指向其父容器的指针。即使它以不需要指针的方式实现,它仍然可以保留它。

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

请问您的用例是什么,您需要知道带有迭代器的容器的“范围”?

答案 6 :(得分:0)

如前所述,最好重写代码,这样就不需要这种行为了。它与持有硬币一样,但你不知道它来自哪里,除非你在纸上注意到它。

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