c++ - 为什么随机访问迭代器的算术运算符接受/返回 int 而不是 size_t?

标签 c++ iterator

由于 std::vector 上的大多数操作都需要/返回 size_t - 这就是我用于索引的类型。但现在我已经启用所有编译器警告来修复一些我知道的有符号/无符号转换问题,这条消息让我感到惊讶:

warning C4365: 'argument' : conversion from 'size_t' to '__w64 int', signed/unsigned mismatch

它是由这段代码生成的:

std::vector<int> v;
size_t idx = 0;
v.insert(v.begin() + idx + 1, 0);

我收到很多其他类似的消息,建议迭代器的算术运算符接受并返回 int。为什么不是 size_t?修复所有这些消息很痛苦,并且不会使我的代码更漂亮!

最佳答案

I've got a lot of other similar messages suggesting that iterator's arithmetic operators accept and return int.

不一定int。它是由迭代器类型的 iterator_traits 定义的(有符号的)difference_type。对于大多数迭代器类型,这默认为 ptrdiff_t

Why not size_t?

因为算术需要正确处理带符号的值;人们会期望 it + (-1) 等同于 it - 1

关于c++ - 为什么随机访问迭代器的算术运算符接受/返回 int 而不是 size_t?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22559499/

相关文章:

c++ - 即使 CMenu 当前打开,如何强制 LVN_HOTTRACK 始终触发

c++ - pair<int,int> 对作为 unordered_map 问题的关键

java - 链表的自定义迭代器

java - 双迭代器循环

rust - 如何使用滑动窗口对生成迭代器?

iterator - 从 Julia 中的向量生成所有无序对

c++ - JPEG of Death 漏洞如何运作?

c++ - "Inheriting" move 运算符?

c++ - 快速找出两组数的公约数

c# - 在 C# 中将 IEnumerable<T> 转换为 List<T> 的最快方法