指定初始大小的std::vector中std::find的行为疑问
std::vector构造、size与std::find行为差异解析
两种vector构造方式的核心区别
std::vector<int> map_rows;:默认构造出来的是空容器,size()返回0,容器内没有任何元素。std::vector<int> map_rows(10);:这是填充构造逻辑,会直接创建10个值初始化的元素。对于int这类内置类型,值初始化就是把元素设为0,所以容器里有10个0,size()返回10。
std::find的行为逻辑
- 空容器无元素可遍历,
std::find会直接返回end()迭代器。如果你的代码里把find返回end()的情况统一处理为返回-1,就会出现所有查找都返回-1的结果。 - 包含10个0的vector中,第一个元素就是匹配项,
std::find会立刻定位到索引0的元素,返回对应迭代器,所以你看到返回索引0。
reserve方法的实际作用
reserve(n)仅为vector预分配能容纳n个元素的内存空间,它不会改变容器的size,也不会创建任何元素。所以调用reserve后,容器仍为空(size()=0),std::find的行为和默认构造的空容器完全一致。
如果要适配大数据量同时不想提前创建元素(避免不必要的初始化开销),用reserve是正确选择;只有当你需要容器一开始就有指定数量的元素时,才适合用填充构造的方式。
内容的提问来源于stack exchange,提问作者CaribeGirl
相关产品推荐
相关产品推荐

