【问题标题】:Indexing an std::vector with a negative index用负索引索引 std::vector
【发布时间】:2013-02-17 00:15:00
【问题描述】:

我尝试使用负索引来索引vector。 vector::at() 成员函数检查指定的索引是否在向量的边界内,如果没有出现,则抛出 out_of_range 异常。

vector<float> array;   // sample vector
array.push_back(0.123);
array.push_back(1.234);
array.push_back(2.345);
array.push_back(3.456);
array.push_back(4.567);

int index = -1;
float f = array.at(index);
cout << f << endl;

vector::at()成员函数的签名要求指定的参数是vector&lt;T&gt;::size_type类型,而这个类型对于vector来说是unsigned int,所以编译器应该从int(的类型index 变量)到unsigned int。由于上例中index的值为-1,所以隐式转换的index为4294967295(即unsigned int类型的最大值):这个值被传递给vector::at()成员函数,这会引发 out_of_range 异常。

也就是说,这个异常不是因为vector::at()成员函数看到index小于零,而是因为隐式转换的index大于vector的当前大小.这是正确的解释吗?

【问题讨论】:

  • 是的,这是正确的解释。

标签: c++ type-conversion implicit-conversion


【解决方案1】:

是的,这是一个正确的解释。 (除了at 需要一个vector::size_type,通常是std::size_t,这是一些未指定的无符号整数类型(通常是系统上指针的位宽)。允许在系统上使用unsigned int,但不是强制的按标准;32 位 unsigned int 和 64 位 size_t 很常见。)

顺便说一句,注意无符号到有符号的转换:标准不要求它是往返有符号->无符号->有符号的负值,并且一些编译器积极优化以意想不到的方式。

【讨论】:

  • 标准不要求它是负值的倒数是什么意思?
  • (int)(unsigned)-1 == -1 不必为真。
  • “一些编译器以意想不到的方式积极优化” - 这种转换是实现定义的,所以不应该有任何优化意外
  • at 接受std::vector::size_type。
  • 实际上,at() 需要一个std::vector&lt;float&gt;::size_type,它可以但不必与std::size_t 相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-30
  • 2015-10-21
  • 1970-01-01
  • 2013-10-29
  • 2010-10-26
相关资源
最近更新 更多