vector :: size()是否可能返回错误值?

时间:2019-02-20 22:00:35

标签: c++ for-loop

在c ++编程类中,我们进行了练习,在这种情况下,我决定在for范围而不是迭代器中使用std :: vector的“大小”函数。然后我的老师告诉我,“有时”函数大小可能返回WRONG值,因此for循环可能超出范围或不足。

我已经用4种不同的编译器用c ++编写了将近2年的书,但事实并非如此。

向量的size()函数是否可以返回错误的值?

编辑:我同意这个问题不需要代码,因为从理论上讲是这样,但是我将用简短的版本来说明您:

#include <iostream>
#include <vector>

using namespace std;

typedef vector<uint64_t> telephone_nums;

int main(int argc, const char * argv[]) {
    vector<telephone_nums> telephone_mat;

    // adding elements to telephone_mat

    for (size_t x = 0; x < telephone_mat.size(); ++x){
        for (size_t y = 0, len = telephone_mat[x].size(); y < len; ++y){
            //modification in the matriz...
        }
    }

    return 0;
}

1 个答案:

答案 0 :(得分:0)

  

向量的size()函数是否可以返回错误的值?

好的。当所需的“正确”值不是向量大小时,它可能会返回“错误”值。

  

我的老师告诉我的是,“ size()”“永远不要在没有上下文的情况下使用”

那真是愚蠢的夸张。

我认为,在某些情况下,尽管索引对初学者来说是正确的,但在某些情况下带有索引和size()的循环会出错是更正确的。在大多数情况下,虽然特定的循环是正确的,但还有更好的选择,可以说更具可读性且不易出错。但是,在某些循环中,索引和size()更为优越,尽管这种情况可能并不常见。

一个初学者在不知不觉中编写行为方式不确定的程序的典型示例,即使该程序在初学者看来是正确的:

for (size_t x = 1; x <= telephone_mat.size(); ++x)

另一个典型的初学者错误:

for (size_t i = 0; i < vec.size(); ++i)
    if (condition)
        vec.erase(vec.begin() + i);

一个示例,可能更简单地编写循环(算法是否适用取决于向量的修改方式):

for (auto& nums : telephone_mat){
    for (auto& element : nums){
        //modification in the matriz...
    }
}