我想知道是否可以通过仅访问容器内的对象来获得容器内对象的迭代器(例如 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<...>::的文档迭代器)所以我很小心地使用上面显示的构造函数,即使它编译。</p>
注意
我使用 std::vector
作为上面的例子,但理想情况下我希望它适用于任何容器,例如std::list
或 std::deque
最佳答案
专用于std::vector
(以及其他连续容器,如 std::string
),给定一个指向 vector 中对象的指针 p
,我们可以简单地做:
auto iter = v.begin() + std::distance(v.data(), p);
这是由连续契约(Contract)保证的。请注意,随机访问在这里是不够的,以上不适用于 std::deque
.
对于任何其他容器,没有简单的方法可以做到这一点。你只需要使用 find_if
:
auto iter = std::find_if(c.begin(), c.end(), [p](auto const& o) { return &o == p; });
对于侵入式容器,迭代器将以某种方式编码到对象本身,因此会有一些直接机制来转换p
。到一个迭代器。但这将取决于侵入式容器本身。
关于c++ - 从指针或引用获取迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37101525/