从指针或引用获取迭代器

Kon*_*app 5 c++ containers pointers iterator

我想知道是否有可能std::vector<...>通过访问容器内的对象来获取容器内部对象的迭代器(例如),例如通过引用(这意味着我们可以访问指向它的指针)&运营商).例如,通常我们将迭代器声明为

std::vector<int>::iterator = vec.begin();
Run Code Online (Sandbox Code Playgroud)

要么

std::vector<int>::iterator = next(vec.begin(), idx);
Run Code Online (Sandbox Code Playgroud)

但在第一个例子中,我们很可能要按顺序迭代容器,而在第二个例子中,我们知道我们需要的对象的索引.我想知道我们是否可以获取对象的迭代器而不知道它驻留在容器中的哪个索引,但是如果我们确实有一个引用或指向它的指针,如上所述.

看起来这个问题似乎已经在这里被提出,但似乎OP更希望其他人修改他的代码,而不是回答一般性问题,所以答案在我看来并不那么令人满意.此外,这里的答案似乎是说我们可以使用构造函数初始化迭代器,如下所示

std::vector<int>::iterator it(...);
Run Code Online (Sandbox Code Playgroud)

但是我在官方文档中找不到std :: iterator类的构造函数的任何证据(我也没能在std :: vector <...> :: iterator上找到任何文档)所以我很谨慎使用上面显示的构造函数,即使它编译.

注意

我用std::vector上面的例子,但理想情况下我希望这适用于任何容器,例如std::liststd::deque

Bar*_*rry 9

特别是std::vector(和其他连续的容器std::string),给定一个指向向量中的对象的指针p,我们可以简单地做:

auto iter = v.begin() + std::distance(v.data(), p);
Run Code Online (Sandbox Code Playgroud)

这是由邻接合同保证的.请注意,此处随机访问不足,以上内容不适用std::deque.

对于任何其他容器,没有简单的方法来做到这一点.你必须使用find_if:

auto iter = std::find_if(c.begin(), c.end(), [p](auto const& o) { return &o == p; });
Run Code Online (Sandbox Code Playgroud)

对于侵入式容器,迭代器将以某种方式编码到对象本身中,因此将有一些转换p为迭代器的直接机制.但这将取决于侵入式容器本身.