如何在std :: deque中获取元素索引

时间:2014-05-26 16:21:05

标签: c++ deque

我有一个双端队列,我有一个属于双端队列的对象。

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

现在我想在deque中获取该元素的索引:

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

我希望索引等于5,但我得到的东西比deque的大小要大。

当然,我可以通过deque查找我的对象,但是可以在O(1)中获取元素的索引吗?

2 个答案:

答案 0 :(得分:5)

由于std::deque<T>中的元素不存储在连续内存中,因此无法根据地址计算std::deque<T>中元素的索引。充其量,您可以使用迭代器并从该位置减去begin()迭代器。但请注意,向std::deque<T>添加或删除元素会使所有迭代器无效,即使指针或对象的引用未被无效。

答案 1 :(得分:3)

这取决于没有引用失效,但您可以使用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);

更容易的选择是保留迭代器而不是引用。