咱们来聊聊C++里的STL库里的vector,这是个特别好用的容器。为什么说它灵活呢?因为它能在程序跑的时候自己动调整大小,不用像数组那样在编译的时候就把空间给锁死。不管是往里面塞东西还是删东西,只要掌握了vector,就相当于手里有了一个高效管动态数组的好帮手。 想弄一个vector出来,咱们通常会有三种办法。第一种是啥也不写,直接写个默认构造,这时候它就是空的,容量也为0。第二种是指定个初始容量,比如写std::vector vec(10),这时候容量是10,里面放的元素默认值都是0。第三种是直接把元素值放进去初始化,比如用花括号{1, 2, 3, 4, 5}这种写法,这样容量和元素值就一次性定下来了。 说到访问元素,咱们可以用下标运算符vec[i],也可以用at()方法。这两个有啥不一样呢?如果i越界了,vec[i]会直接扔出一个std::out_of_range异常,而vec.at(i)也会抛异常,不过它能在编译的时候检查一下是不是越界了,用起来更安全。推荐在循环或者传参的时候用下标操作,需要让代码好看的时候就用at()。 要往vector里加东西或者把东西去掉,这里面门道挺多。比如push_back是把一个元素塞到末尾去,这时候容量会自动变大;pop_back是把最后一个元素拿掉,容量就减1。 再比如insert和erase配合起来用也挺常见。先拿迭代器指向第3个元素的位置,然后用insert在那个位置前加个5进去。不过这时候要注意个坑:erase返回的是下一个元素的迭代器,如果直接写++iter可能就会越界了。正确的做法是再重新拿个vec.begin()来定位。 还有一种情况是用remove加上erase来操作。先在vec里加个3进去假设现在是{1, 2, 3, 4}。这时候调用remove把所有的3往后挪挪位置但不删掉(相当于把待删除的3移到末尾),这时候如果不接着调用erase的话内存就浪费了(内存泄漏),所以得跟上erase才能真正释放空间。 最后聊聊清空和释放内存的事儿。clear()这个函数就是把size置0了,但capacity不会变(内存还在)。要是想彻底把内存给放掉可以用swap的技法:先搞个临时的空vector跟原来的交换一下位置,这样系统就会去释放那块旧内存了。 结论就是当你不再需要这个vector而且想赶紧把内存收回来的时候,先clear()一下再swap一下是最稳的法子。