我可以创建一组 list::iterators 吗?在我 erase/insert 来自同一列表的其他节点之后,它们是否仍会指向同一节点?

Can I create a set of list::iterators? Will they still point to the same node after I erase/insert other nodes from the same list?

我想创建一组list::iterators,这样当我更新列表中的其他节点时,我的迭代器仍然指向同一个节点。

int n;
string s;
cin >> n >> s;

list<char> str;
for (char c : s) {
    str.push_back(c);
}

vector<set<list<char>::iterator>> locations(10);
for (auto it = str.begin(); it != str.end(); ++it) {
    auto next = it;
    ++next;

    if (next != str.end()) {
        int l = *it - '0', r = *next - '0';
        if ((l + 1) % 10 == r) {
            locations[l].insert(it);
        }
    }
}

我收到一个编译错误

error: no match for ‘operator<’ (operand types are ‘const std::_List_iterator’ and ‘const std::_List_iterator’) 386 | { return __x < __y; }

我做错了什么?这在 C++ 中可能吗?或者我应该创建自己的节点结构并存储指向它的指针吗?

PS - 我正在尝试解决来自 Google Kickstart (https://codingcompetitions.withgoogle.com/kickstart/round/0000000000435914/00000000008d94f5) 的问题,字符串 s 仅包含 0-9 中的数字。

您需要一个自定义比较器。例如。像这样:

struct CompareIterators {
  template <typename It>
  bool operator()(It iter1, It iter2) const {
    using Ptr = decltype(&*iter1);
    return std::less<Ptr>{}(&*iter1, &*iter2);
  }
};

using MySet = set<list<char>::iterator, CompareIterators>;
vector<MySet> locations(10);

MySet 中元素的顺序基本上是随机的,不可预测的。它不一定对应于列表中节点的顺序。它所确保的是,如果将迭代器插入同一元素两次,它只会在集合中出现一次。