2008-12-17 105 views
6

有什么方法可以找到迭代器指向的容器?具体来说,我希望能够找到std :: vector :: iterator指向的std :: vector,以便我可以检查范围,而不必实际将引用传递给该向量。查找STL迭代器的所有者

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

编辑:谢谢你一些快速和(主要是)准确的答案。 Evan Teran钉上它。我根本没有考虑优化,但现在很明显。

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

回答

6

我不这么认为。如果迭代器必须保留一个引用/指针给那里的所有者,那么它们不可能被优化到一个轻量级的指针(这可以通过容器来保证连续的存储,比如向量等)。

0

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

迭代器旨在遍历集合,正因为如此,他们提供做到这一点,只有必要的接口。这是很好的面向对象的编程原则。

请问您的使用情况是什么,你需要知道有一个迭代器容器的“范围”?

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你身边存储到容器的引用迭代器自己的包装。

+0

我不认为这真的有什么关系的问题是有人问... – jdmichal 2008-12-17 19:01:02

+3

这说明了为什么你不能从一个具体的和简单的例子... – 2008-12-17 21:12:10

2

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

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

你可以,但是,通过装饰随机访问迭代器包含一个指向创建矢量东西定义随机访问迭代器的扩展。这可能稍微不雅,效率低下,不方便。所以看看你是否可以重写代码以避免这种需求。

1

STL不允许这样做。

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

0

正如前面建议最好是重新编写代码,这样你就不需要这种行为。这与持有一枚硬币一样,但你不知道它来自哪里,除非你在纸上注明。

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

4

没有办法,使这项工作。原因很简单:向迭代器添加一个方法以获取它们指向的容器是

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

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