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

时间:2019-04-17 18:18:30

标签: c++

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

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

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

1 个答案:

答案 0 :(得分:4)

是,将被转换为size_t,而没有任何警告或错误。但是要当心负值。如果您的int i为负,则转换将产生std::numeric_limits<size_t>::max() + 1 - abs(i),通常为非常大的数字,可能会导致不良后果。因此,如果索引可以是负数,请在索引编制之前进行检查。

UPD : 严格来说,根据您的编译器标志,可能会出现警告。在使用g ++的情况下,此处有两个相关内容:

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

我怀疑他们之所以在C ++中取得成功,恰恰是因为人们通常使用-Wsign-conversionstd::vector编制索引,并且如果警告出现在警告中,则必须花费过多的int来消除警告。这种情况。

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

AFAIK,C ++标准没有明确要求static_cast的大小等于或大于size_t。但是我不知道在哪个平台上并非如此。因此,从intint的转换属于第二类。

总结:如我之前所说,除非您使用带有size_t开关的g ++,否则很可能不会收到从C ++到intsize_t转换的警告。 / p>