【问题标题】:vector.size() is working unexpectedly in comparision相比之下,vector.size() 的工作出乎意料
【发布时间】:2019-03-25 04:30:11
【问题描述】:

当我在比较中使用 vector.size() 时,它会给出意想不到的结果

vector<int> v;
for(int i = 0; i < v.size() -1;++i){
    printf("i = %d\n", i);
    printf("v[i] = %d\n", v[i]);
}

由于向量的大小为0,它不应该打印任何东西,而是进入for循环并打印i = 0并给出分段错误。但它甚至不应该进入 for 循环,因为 v.size() - 1-1

为什么会这样?

【问题讨论】:

  • 别忘了向量是从 empty 开始的。空向量中的所有和任何索引都将超出范围,因此导致undefined behavior
  • 是的,但关键是它甚至不应该进入循环,因为 vector.size() - 1, 是-1
  • 在一个不相关的说明中,你为什么在 C++ 中使用printf?为什么不std::cout
  • @Someprogrammerdude 因为当它给出分段错误时它不显示 cout 的内容

标签: c++ vector error-handling segmentation-fault


【解决方案1】:

问题在于你的循环:

 for(int i = 0; i < v.size() -1;++i)

更具体地说,这部分条件:v.size() - 1

size 函数返回一个 size_type 类型的值,如果您阅读例如this vector reference 会看到是一个 unsigned 类型。

这意味着当你从值0 中减去1 时,你不会得到-1,而是会得到一个非常大的值,因为无符号下溢会回绕到它的最大值。

这意味着当您索引超出范围时,您的循环确实会迭代,至少一次,并导致 UB(未定义行为)。

【讨论】:

    【解决方案2】:

    向量大小是一个无符号整数,所以 v.size() - 1 永远不会是 -1 而是一些非常大的整数。

    【讨论】:

    • 另外,如果你使用 size() - 1 你会错过最后一个不为空的元素...
    • 我是故意用的,所以没有问题。
    猜你喜欢
    • 2014-10-02
    • 1970-01-01
    • 2020-04-12
    • 1970-01-01
    • 1970-01-01
    • 2011-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多