当前位置: 首页 > 知识库问答 >
问题:

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

程智明
2023-03-14

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

警告C4365:“参数”:从“size\u t”转换为“\uu w64 int”,有符号/无符号不匹配

它是由以下代码生成的:

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

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

共有2个答案

卫俊誉
2023-03-14

它允许这样的事情:它=索引 其中索引可以是正的,也可以是负的(根据某些逻辑)。

对比如下:

if (some_condition)
    it += index;
else
    it -= index;

如果我们只能传递无符号值,这将是必要的。

赫连琦
2023-03-14

我得到了许多其他类似的消息,建议迭代器的算术运算符接受并返回int。

不一定是int。它是由迭代器类型的迭代器特征定义的(有符号的)差异类型。对于大多数迭代器类型,这默认为ptrdiff\u t。

为什么不size\u t?

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

 类似资料:
  • 考虑以下代码: 这会产生编译错误,因为添加2字节的结果是Int。 为了解决这个问题,我需要手动将结果转换回字节: 这是非常反直觉的。为什么算术运算符是这样工作的?

  • 我正在开发一个返回算术表达式的程序,其中包括运算符和整数。我为其实现的代码如下: 这段代码的问题是它返回运算符,但表达式中的所有运算符都是相同的:例如:我得到一个表达式9 2 3 4 5=?我不想让它全部包含,它可以是一个表达式中的许多随机运算符。任何帮助都将不胜感激。谢谢

  • 这个问题基本上是说迭代一个整数,然后计算这个数是否可以被它的左边数整除,如果它可以整除,则返回一个布尔数组。 73312 第一个数字没有左边的数字,所以它是假的 我运行了测试,一切都很好,但是有了这个数字(73312),当它应该返回false时,它会返回true。 预期输出 实际输出

  • 我想知道为什么c标准要求只接受随机访问迭代器?我不认为这有什么好处,因为std::sort和std::list::sort的复杂性都是。将限制为随机访问迭代器(RAI),似乎需要为具有相同复杂性的列表编写单独的函数。 同样的情况也适用于,其中列表的非RAI计数器部分至今仍然缺失。 这种设计是因为历史上人们使用了的变体来实现? 如果在RAI容器上编写排序算法有好处,那么最好使更通用,并让像这样的RA

  • 我使用的是我的代码中有两个可观察的对象 观察值不是来自请求,而是来自 我需要根据这个逻辑将序列组合/转换成一个单一的可观察值: 如果序列,或,-需要返回新的可观察的否则需要返回 我试图使用来实现: 但问题是我的

  • 问题内容: 为什么不: 代替: 获得唯一哈希码的更高机会? 问题答案: 因为数组的最大长度为。 由于的主要用途是确定将对象插入/ 的后备数组中的哪个插槽,因此hashcode> 将无法存储在该数组中。