为什么我不能使用列表迭代器逻辑比较运算符?
why can't i use list iterator logical comparisons operator?
这是非常基本的,但我在这里找不到类似的问题。我试图使用列表从不同的方向迭代相同排序的STL列表。我知道我可以将迭代器与list.begin()
和list.end()
进行比较,那么为什么不行呢?
list<family>::iterator itLargeFamily =
families.begin(); //starts from the biggest families
list<family>::iterator itSmallFamily =
families.end(); //starts from the smallest families
for (; itSmallFamily > itLargeFamily; --itSmallFamily, ++itLargeFamily) {
// stuff...
}
错误当然是
没有匹配的操作数
100%可能我错过了一些基本的东西
只有随机访问迭代器是有序的。std::list
迭代器仅为双向迭代器,因此不支持operator<
和operator>
。
相反,您可以与!=
进行比较。
while (itSmallFamily != itLargeFamily)
你必须确保迭代器不会相互跳过,这样才能正常工作。也就是说,如果itSmallFamily
和itLargeFamily
只有一个增量的距离,你只需要把它们交换一下,它们就永远不会相等了。
可以使用std::vector
,它的迭代器是随机访问迭代器。另外,std::array
和std::deque
也支持随机访问。
从sftrabbit的注释和回答中可以看出,关系运算符仅为随机访问迭代器定义,而std::list
只有双向迭代器。所以这里有几个解决你的问题的方法:
- 使用
std::vector
或std::array
。它们提供随机访问迭代器,对于较小的大小具有更好的性能,并且取决于您如何填充/使用它们来处理较大的大小,并且它们具有更好的内存占用。这是首选的解决方案,我称之为"默认"解决方案。只有当有一个非常好的、可衡量的理由时才使用其他容器(例如,分析器告诉您使用该容器是性能瓶颈)。 -
既然你知道列表的大小,你可以为你的迭代使用计数器:
for (size_t i = 0, count = families.size()/2; i < count; ++i, --itSmallFamily, ++itLargeFamily) { /* do stuff */ }
-
由于列表已排序,因此可以比较迭代器所指向的元素,而不是迭代器本身。
相关文章:
- 为什么比较运算符如此快速
- 布尔比较运算符是如何在C++中工作的
- 关于 std::min, std::max 中的比较运算符的混淆
- 三向比较运算符成员与非成员实现
- 标准::可选枚举的比较运算符
- C++分数混合比较运算符错误
- 不能将重载比较运算符与 Catch 测试一起使用
- 重构使用动态强制转换的 std::set 的比较运算符
- 为什么我的比较运算符不比较我的点长和双精度值?
- 高效简单的结构比较运算符
- 如何实现 Boost.Hana 结构的相等比较运算符?
- 为什么sub_match和basic_string比较运算符使用额外的字符串副本实现?
- 是否可以在C++中使用三元运算符在 if 语句中选择比较运算符?
- 在priority_queue的自定义类中重载比较运算符
- 为什么C++容器之间存在比较运算符
- 尝试使用比较运算符对对象向量进行排序
- C++复合逻辑运算符不使用比较运算符
- C++:比较运算符>和字符串文本的意外结果
- 重载对象成员的比较运算符
- 比较运算符==中的对象指针