C++ vector使用的一些注意事项
C++ 中的 vector 是一个非常常用的容器类,它提供了一个动态数组的实现,能够自动管理内存,避免了手动内存管理的麻烦。然而,在使用 vector 时需要注意一些问题,这篇文章将为大家介绍一些关于 C++ vector 使用的一些注意事项。
初始化
在 C++11 以后,vector 的初始化方式增加了大括号 {} 的方式,需要注意与 () 的区别。例如:
`std::vector<int> vecTest1(5);` // 初始化 5 个元素,每个都是 0
`std::vector<int> vecTest2{ 5 };` // 初始化 1 个元素,值是 5
添加元素
添加元素时,vector 的内存有时候会发生变化,这取决于 size 和 capacity 的大小。当 size 小于 capacity 时,直接将元素添加到尾部,不会变化。当 size 等于 capacity 时,会重新申请另外一块内存,然后 copy 过去并添加到尾部,这个时候就会有变化了。
vector 是一段连续的内存空间,有三个标识内存的位置,start,end,finish, size=end-start, capacity=finish-start。很多时候,在使用 vector 时,会看到 size=capacity,这个时候直接添加元素到尾部,内存明显是不够的,此时会重新在别处分配一块大小足够的内存。
erase 和 remove
erase 返回的是当前删除的元素的下一个位置的迭代器,所以需要注意的是遍历时候的 ++ 运算,这个与其它 list、map 差不多。需要注意的是 erase 后内存并未真正的清空,仅仅是删除内容,真正的容量大小 capacity 并没有改变,需要通过 swap 来实现 capacity 的减小。
例如:
`auto itor = vecNum.begin();`
`for( ; itor != vecNum.end(); ){`
` auto num = *itor;`
` if(num == 60) {`
` itor = vecNum.erase(itor);`
` break;`
` } else {`
` itor++;`
` }`
`}`
`std::cout << "after erase element 60:" << std::endl;`
`printVector(vecNum);`
`vector<int>(vecNum).swap(vecNum); // 将 vecNum 的内存空洞清除`
`printVector(vecNum);`
remove 只是通过迭代器的指针向前移动来删除,将不需要删除的元素往前移,因此需要删除的就都在尾部了。返回新的指向尾部需要删除的元素的迭代器。因此还是得配合 erase 来使用,所以一般真要删除,建议直接遍历使用 erase。
C++ 中的 vector 是一个非常有用的容器类,但需要注意一些使用注意事项,以避免出现一些问题。