如何在std::deque中获得元素的索引?

How do I get index of element in std::deque

本文关键字:元素 索引 std deque      更新时间:2023-10-16

我有一个deque和一个属于这个deque的对象。

std::deque<Item> items;
// full deque with objects
// ...
Item &item = items[5];

现在我想要得到deque中那个元素的索引:

size_t index = &item - &*m_items.begin();

我期望index等于5,但是我得到了比deque大的数

当然,我可以遍历deque来查找我的对象,但是有可能得到O(1)中元素的索引吗?

不能根据地址计算std::deque<T>中元素的索引,因为std::deque<T>中的元素不是存储在连续内存中。最好的情况是,您可以使用迭代器并从位置中减去begin()迭代器。但是,请注意,向std::deque<T>添加或删除元素会使所有迭代器无效,即使指向对象的指针或引用不会无效。

这取决于没有引用失效,但是您可以使用std::find_if通过地址查找元素,然后使用std::distance获得索引。

Item &item = items[5];
Item* p = &item;
auto it = std::find_if(items.begin(),
                       items.end(),
                       [p](const Item& i) {return p == &i;});
auto idx = std::distance(items.begin(), it);

更简单的选择是保留迭代器而不是引用。