C++中vector的正确长度获取:sizeof()还是size()?
遍历vector时,该用size()还是sizeof()?
结论很明确:只有vector.size()是正确获取vector元素个数的方式,用sizeof(vector)完全是错误用法,之前偶然能运行只是巧合。
两者的本质区别
vector.size():这是C++标准库vector容器提供的成员函数,专门用来返回当前vector中实际存储的元素数量。比如你往vector里存了3个字符串,它就返回3,这正好是你遍历循环需要的边界值。sizeof(vector_to_print):这是C++的运算符,作用是计算vector对象本身在内存中占用的字节数,和容器里的元素个数毫无关系。vector的元素实际存在堆内存里,vector对象本身只存一些管理用的元数据(比如指向元素的指针、当前容量、元素个数),所以不管你往vector里塞多少元素,这个对象本身的字节数是固定的(比如64位系统下通常是24字节)。
为什么之前用sizeof()看似能运行?
这只是碰巧你的vector元素个数刚好等于vector对象的字节数,或者你测试时元素少,越界访问的位置刚好没触发程序崩溃,但这属于未定义行为——程序可能输出乱码、崩溃,或者看起来正常,但本质上已经错了。哪天你存的元素个数变多,或者换了不同的编译环境,sizeof的结果变了,程序立刻就会出问题。
看你的代码对比
第一个用sizeof的版本,循环条件i < sizeof(vector_to_print)会让循环跑sizeof(vector_to_print)次,远超过实际元素数时,访问vector_to_print[i]就是越界读取,完全错误。第二个用size()的版本,循环次数刚好等于元素个数,是正确的写法。
额外提个小建议:你的函数参数是传值的vector<string> vector_to_print,每次调用都会拷贝整个vector,效率很低,改成传常量引用const vector<string>& vector_to_print会更好。
内容的提问来源于stack exchange,提问作者BrianDawe
相关产品推荐
相关产品推荐

