c++ - 如何定义指向另一个容器中元素的迭代器的值类型
How to define the value type for iterator which points to an element in another container in c++
我想达到的目的是:
我有一个 unordered_map<int, list<int>::iterator> mp
和一个 list<int> lst
。如何将元素的迭代器存储在 lst
中。后来,通过使用 map 中的迭代器,我可以操作(例如,擦除)列表中的元素。 (假设没有迭代器失效问题)
以下代码段无效:
unordered_map<int, list<int>::const_iterator> mp;
list<int> lst;
lst.push_back(1);
mp[1]=lst.crbegin(); //error here
lst.erase(mp[1]);
...
我也尝试过存储原始指针,但我无法使用原始指针擦除列表中的元素。我想知道实现我的目的的最佳方法是什么。
您将错误类型的迭代器放入 unordered_map
:
unordered_map<int, list<int>::const_iterator> mp;
// ...
mp[1] = lst.crbegin(); // error, const reverse iterator
mp[1] = lst.cbegin(); // ok
如果你想让unordered_map
的值类型包含反向迭代器,你需要指定:
unordered_map<int, list<int>::const_reverse_iterator> mp;
// ...
mp[1] = lst.cbegin(); // error, const forward iterator
mp[1] = lst.crbegin(); // ok
这是 demo。
您似乎在尝试添加一个反向迭代器,因为您想方便地获取指向列表中最后一个元素的迭代器。你可以这样做:
mp[1] = std::prev(lst.cend(), 1);
我想达到的目的是:
我有一个 unordered_map<int, list<int>::iterator> mp
和一个 list<int> lst
。如何将元素的迭代器存储在 lst
中。后来,通过使用 map 中的迭代器,我可以操作(例如,擦除)列表中的元素。 (假设没有迭代器失效问题)
以下代码段无效:
unordered_map<int, list<int>::const_iterator> mp;
list<int> lst;
lst.push_back(1);
mp[1]=lst.crbegin(); //error here
lst.erase(mp[1]);
...
我也尝试过存储原始指针,但我无法使用原始指针擦除列表中的元素。我想知道实现我的目的的最佳方法是什么。
您将错误类型的迭代器放入 unordered_map
:
unordered_map<int, list<int>::const_iterator> mp;
// ...
mp[1] = lst.crbegin(); // error, const reverse iterator
mp[1] = lst.cbegin(); // ok
如果你想让unordered_map
的值类型包含反向迭代器,你需要指定:
unordered_map<int, list<int>::const_reverse_iterator> mp;
// ...
mp[1] = lst.cbegin(); // error, const forward iterator
mp[1] = lst.crbegin(); // ok
这是 demo。
您似乎在尝试添加一个反向迭代器,因为您想方便地获取指向列表中最后一个元素的迭代器。你可以这样做:
mp[1] = std::prev(lst.cend(), 1);