我可以创建一组 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
中元素的顺序基本上是随机的,不可预测的。它不一定对应于列表中节点的顺序。它所确保的是,如果将迭代器插入同一元素两次,它只会在集合中出现一次。
我想创建一组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
中元素的顺序基本上是随机的,不可预测的。它不一定对应于列表中节点的顺序。它所确保的是,如果将迭代器插入同一元素两次,它只会在集合中出现一次。