我有一个双端队列,我有一个属于双端队列的对象。
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)中获取元素的索引吗?
答案 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);
更容易的选择是保留迭代器而不是引用。