在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;
}
答案 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...
}
}