【发布时间】:2016-09-03 05:56:25
【问题描述】:
我想知道是否可以通过仅访问容器内的对象来获取容器内对象的迭代器(例如std::vector<...>),例如通过引用(这意味着我们可以使用& 运算符访问指向它的指针)。例如,通常我们将迭代器声明为
std::vector<int>::iterator = vec.begin();
或
std::vector<int>::iterator = next(vec.begin(), idx);
但是在第一个示例中,我们很可能要按顺序遍历容器,而在第二个示例中,我们知道我们需要的对象的索引。我想知道我们是否可以在不知道对象驻留在容器中哪个索引处的情况下获取对象的迭代器,但如果我们确实有一个引用或指向它的指针,如上所述。
似乎这个问题已经被问过here,但看起来更像是 OP 希望其他人修复他的代码,而不是回答一般问题,所以我认为答案并不那么令人满意。还有here的回答好像说我们可以用构造函数初始化迭代器,如下图
std::vector<int>::iterator it(...);
但我无法在官方文档中找到 std::iterator 类的构造函数的任何证据(我也无法在 std::vector<...>:: 上找到任何文档iterator) 所以我很谨慎地使用上面显示的构造函数,即使它可以编译。
注意
我使用std::vector 作为上面的示例,但理想情况下我希望它适用于任何容器,例如std::list 或 std::deque
【问题讨论】:
-
你可以浏览一个索引。
vec.begin()+(pos-&vec[0]) -
@KonradKapp 那么你应该寻找关于如何找到索引的问题;-)
-
@dyp 是的,很抱歉第一次不清楚。我在问题中添加了注释。我更喜欢使用迭代器,因为我希望将它用作 for 循环中的中断条件。但这无关紧要:)问题更普遍的是关于是否可以以这种方式获得迭代器(不过,这似乎应该很容易)
-
调试迭代器实现可能希望在迭代器中存储指向某个簿记对象的指针;在这种情况下,可能无法仅从元素的引用或指针构造迭代器(因为元素的位置和簿记对象的位置不相关)。当然,总是可以实现一些全局 LUT,但这很快就会变得丑陋/缓慢。
-
由于迭代器的类型很多,您不太可能找到一种统一的方法来解决所有这些问题。当然,您可以只创建您选择的迭代器并进行迭代,直到它与您的给定项目匹配。
标签: c++ pointers iterator containers