一、标准库函数
1. 构造数组 ——参考博客
一维数组构造:
// 构造一维数组 vector<int> vec(n); // n为vec长度,默认所有值为0 vector<int> vec(n, 1); // 所有值设为1
二维m*n数组构造:
// 构造二维维数组 vector<int> tmp(n); // n为vec长度,默认所有值为0 vector<vector<int> > vec(m, tmp); // 所有值仍为0
2. 空间相关
size_type size(); // 得到实际元素个数 size_type max_size(); // 系统可提供的vector容器能存放的元素数目的极限值 size_type capacity() const noexcept; // 得到已申请的空间能存放的元素个数
* size_type即 unsigned int。vector max_size中未使用的部分不一定会保留,有可能使用时就出错了
void resize (size_type n); void resize (size_type n, const value_type& val); void reserve (size_type n);
resize函数时扩展用户可见的空间大小。reserve将capacity扩展为n(相当于扩容时的操作)(当 n <= capacity时无操作)。
1)若 n <= size,保留前n个元素,后面的调用erase;否则,扩容到总大小为n。若 n > max_size,则还要申请更多空间(2倍于现空间,并将现有元素拷贝到新空间内)。
2)若提供了val,则新插入的值为val,否则插入默认值(0)。
3. assign 与 swap
void assign (InputIterator first, InputIterator last); // InputIterator: iterator of input vector void assign (size_type n, const value_type& val); // n elements with a copy of val void assign (initializer_list<value_type> il); vec.assign(input_vec.begin(), intpu_vec.end()); vec.assign(my_array, my_array+4); // my_array 是一个普通的数组
assign为vector分配新的内容,并将size设为新分配后的大小。
void swap (vector& x); vec.swap(old_vec);
swap交换两个vector的内容,相当于vec现在指向old_vec的空间,二者的所有属性都互换了。
4. erase 与 clear
iterator erase (const_iterator position); iterator erase (const_iterator first, const_iterator last); void clear() noexcept;
* erase 返回得到 指向被删除的位置的下一个位置的迭代器
erase操作具体为:将尾部未删除的部分拷贝到删除的起始点处,将新尾部之后的内容 _Destory,再将尾部设为新尾部。 ——参考博客
注意,_Destroy() 将对应的删除区的元素调用析构函数,
1)若要销毁的为 int 等简单类型,析构不会对内存上的值操作;
2)如果元素是一些object,则它将为当前存储的每个元素调用它们各自的析构函数。
3)如果元素是指向对象的指针,并不会自动调用对应的析构函数。直接clear会造成内存泄漏应遍历vector使用delete,然后再调用clear,完成删除。
clear调用 erase(begin(), end()) ,没有其它步骤。
二、部分细节
1. 使用下标访问元素时,不会进行越界检查,编译无问题; 可以使用 at() 函数读取元素,该函数内部会进行越界检查
2. 截取部分片段
#include <iostream> #include <vector> int main() { std::vector<int> vector{1,2,3,4,5,6,7,8,9}; //截取前4个数 std::vector<int>::const_iterator first1 = vector.begin(); std::vector<int>::const_iterator last1 = vector.begin() + 4; // 停止的地方,取到这一位之前一个 std::vector<int> cut1(first1, last1);//截取后4个数 std::vector<int>::const_iterator first2 = vector.end() - 4; std::vector<int>::const_iterator last2 = vector.end(); std::vector<int> cut2_(first2, last2); // 停止的地方 }
3. 支持的运算符
如果vector中的元素类型是简单类型(内置类型),则支持: !=, ==, <, <=, >, >=,后四种运算符可以用于比较两个vector的大小(按字典序)。