C++STL序列容器
作为cppreference以及cplusplus的补充说明笔记。记录使用STL过程中cppreference文档示例没有举例的地方,以及重要知识点总结。
vector
std::vector 是封装动态数组的顺序容器。故末端操作较快。
vector<bool>
节省空间的动态 bitset
(类模板特化)
构造函数
1.vector构造二维数组
//初始化大小为零的二维数组
std::vector<std::vector<int> > vec;
//初始化row * col二维动态数组,初始化值为0
std::vector<std::vector<int> > vec(row,vector<int>(col,0));
int size_row = vec.size(); //获取行数
int size_col = vec[0].size(); //获取列数
析构函数
解分配vector所用的存储。注意,若元素是指针,则不销毁所指向的对象。
Iterators:
begin,rbegin,cbegin,crbegin
返回迭代器,
r:反向迭代器reverse iterator
c:const_iterator
end,rend,cend,crend
同上。
Capacity
size
返回向量中的元素数。
size_type size() const noexcept;
capacity
实际vector所占内存大小,单位是元素数。
size_type capacity() const noexcept;
max_size
返回vector可以容纳的最大元素数。
size_type max_size() const noexcept;
resize
n小于size保留前n个。
n大于size小于capacity,扩展容器不扩容。
n大于capacity扩容,并拷贝原vector内容。
void resize (size_type n);
void resize (size_type n, const value_type& val);
reserve
void reserve (size_type n);
resize&reserve区别
reserve()
只修改capacity大小,不修改size大小,
resize()
既修改capacity大小,也修改size大小(改变size大小同时给增长元素赋值)。
empty
true容器size为0,其余为false
shrink_to_fit(c++11)
使capacity等于size,即释放多余空间。
void shrink_to_fit();
Element access
operator[]
at
边界检查。
reference at (size_type n);
const_reference at (size_type n) const;
front
reference front();
const_reference front() const;
back
reference back();
const_reference back() const;
data
若 size()
为 0 ,则 data()
不一定返回空指针。
Modifiers
assign
//拷贝函数,把first到last的值赋值给调用者;(注意区间的闭合)
template <class InputIterator>void assign (InputIterator first, InputIterator last);
//n个x赋值给调用者
void assign (size_type n, const value_type& val);
void assign (initializer_list<value_type> il);
push_back
void push_back (const value_type& val);
void push_back (value_type&& val);
pop_back
void pop_back();
insert
iterator insert (const_iterator position, const value_type& val);
erase
返回最后删除元素的后一个位置,若最后删除的是末尾元素则返回end
iterator erase (const_iterator position);
iterator erase (const_iterator first, const_iterator last);
swap
交换两个vector,长度可不等。
void swap (vector& x);
std::vector<int> foo (3,100); // three ints with a value of 100
std::vector<int> bar (5,200); // five ints with a value of 200
foo.swap(bar);
clear
size置0,不改变capacity。
void clear() noexcept;
通过交换,可清空并改变capacity。
vector<T>().swap(x); // clear x reallocating
emplace(C++11)
构造和插入元素
返回指向新放置元素的迭代器。
template <class... Args>
iterator emplace (const_iterator position, Args&&... args);
emplace_back(C++11)
在最后构造并插入元素。无返回值。
template <class... Args>
void emplace_back (Args&&... args);
emplace&insert
emplace执行效率要高于insert。
当调用insert时,是将对象传递给insert,对象被拷贝到容器中。
使用emplace时,是将参数传递给构造函,emplace使用这些参数在容器管理的内存空间中直接构造元素。
Allocator
get_allocator
返回与vector关联的分配器对象的副本。
allocator_type get_allocator() const noexcept;