可以使用整数索引访问向量元素吗?

Is it okay to access vector elements with an integer index?

本文关键字:元素 向量 访问 整数 索引 可以使      更新时间:2023-10-16

我有一些整数变量和一个向量。我需要使用整数变量作为向量中的索引。

可以简单地说some_vector[some_integer]吗?

还是我需要以某种方式将整数转换为大小类型?

是的,将在没有任何警告或错误的情况下转换为size_t。但要注意负值。如果你的int i是负数,转换将产生std::numeric_limits<size_t>::max() + 1 - abs(i),通常是一个非常大的数字,这可能会导致不良后果。因此,如果索引可能为负数,请在索引之前检查它。

上发:严格来说,可能会有警告,具体取决于编译器标志。在 g++ 的情况下,这里有两个相关的:

  1. -Wconversion警告可能会更改价值的转化。在整数转换中,当目标类型小于源类型时,可能会发生这种情况(例如int32_t y = 1000; int16_t x = y;)。
  2. 目标为无符号的有符号
  3. -无符号转化(例如int16_t y = -1; uint32_t x = y;) 或目标与源大小相同(例如unsigned int y = UINT_MAX; int x = y;) 也可能更改该值,在 C 中-Wconversion确实会发出警告,但在C++中您需要添加-Wsign-conversion才能使其显示。

我怀疑他们在C++中做出区分正是因为人们通常在使用int索引std::vector,并且如果在这种情况下出现警告,则必须做太多static_cast才能摆脱警告。

Microsoft CL 通过警告 C4244 覆盖第一种情况,由/W3 或/W4 打开,对于第二种情况,我找不到警告开关。如果有人知道,请在评论中告诉。

AFAIK,C++标准没有明确要求size_t的大小相等或大于int。但我不知道有哪个平台不是这种情况。因此,从intsize_t的转换属于第二类。

总结一下:正如我之前所说,您很可能不会收到intsize_tC++转换的警告,除非您将 g++ 与-Wsign-conversionswitch 一起使用。