vector
构造函数:
//default: vector<T> v; //空的vector //fill: vector<T> v(n); //n个元素的vector,元素默认初始化 vector<T> v(n, value); //n个元素值为value的vector //range: vector<T> v(first, last); //两个迭代器之间的元素构成的vector vector<T> v(arr, arr + sizeof(arr) / sizeof(T)); //由内置数组构造的vector //copy: vector<T> v(const vector<T> &u); //v是u的拷贝 //move: vector<T> v(vector<T> &&x); //x是右值引用(只能引用右值,如vector<int> &&x = {1,2,3};) //initializer list: vector<T> v{value1, value2...};
赋值与swap:
v1 = v2;
v1 = {value1, value2...}; v1.swap(v2); swap(v1, v2);
大小:
size_type v.size() const noexcept; //元素数目 size_type v.capacity() const noexcept; //当前为该vector分配的空间可以容纳的元素数目 size_type v.max_size() const noexcept; //可容纳元素的最大数目 //max_size >= capacity >= size bool v.empty() //是否为空 v.resize(n); //调整元素大小,使容器中含n个元素 v.resize(n, value); //调整后的vector中每个元素的值都为value v.reserve(n); //请求改变capacity的大小,使得vector至少可以容纳n个元素 v.shrink_to_fit(); //请求退还多余内存,但标准库不保证完全退还(C++11)
获取元素:
v[i] = value; v.at(i) = value; v.front() = value; //第一个元素 v.back() = value; //最后一个元素 T *p = v.data(); //p为指向v中第一个元素的指针(C++11)
修改:
//assign v.assign(n, value); //将v置为n个值为value的元素 v.assign(first, last); //用t的两个迭代器之间的值为v赋值,左闭右开 t可以是vector、array、list、forward_list、deque、set、unordered_set、multiset、unordered_multiset等。 vector元素的顺序和重复性由传入的容器类型性质决定 v.assign(begin(t), end(t)); //与上条语句类似,除上述类型,还支持内置数组类型 v.assign(arr, arr + n); //将数组中的一部分赋给v v.assign({value1, value2...}); //列表 v.push_back(value); //尾部插入一个元素 v.pop_back(); //删除最后一个元素 //insert v.insert(it, value); //迭代器指向的位置插入值为value的元素 v.insert(it, n, value); //迭代器指向的位置插入n个值为value的元素 v.insert(it, first, last); //迭代器it指向的位置插入另一个容器的两个迭代器之间的元素 v.insert(it, x); //x是T的右值引用 T&& v.insert(it, {value1, value2...}); //列表 //以上函数返回一个指向新插入的第一个元素的迭代器 //emplace(C++11) v.emplace(it, args); //以args为参数,调用T的构造函数构造一个对象插入it所指的位置 v.emplace_back(args); //将构造的T对象插入vector的尾部 //以上函数返回一个指向新插入的元素的迭代器 //insert vs emplace: //insert传对象或引用,emplace传参数调用构造函数 struct Foo { Foo(int n, double x); }; std::vector<Foo> v; v.emplace(someIterator, 42, 3.1416); v.insert(someIterator, Foo(42, 3.1416)); //erase v.erase(it); //删除it指向的元素 v.erase(first, last); //删除范围内的元素 //以上函数返回一个迭代器,指向被删除的最后一个元素之后的元素 v.clear(); //删除所有元素
获取迭代器:
v.begin(), v.end(); //首元素位置,尾后位置 v.cbegin(), v.cend(); //const_iterator //reverse_iterator 按逆序寻址 //const_reverse_iterator v.rbegin(), v.rend(); v.crbegin(), v.crend();
begin(v), end(v);
以上带c的版本是C++11引入的, 用以支持auto。
vector<bool>特有的函数:
void flip() noexcept; //所有元素取反 static void swap (ref1, ref2) noexcept; //除通用的swap,还有一个静态swsap函数,用于交换ref1和ref2对应的位.