vector实现原理是数组,其元素在内存上是连续的。
学会vector的关键在于区别size()和capacity()。
其成员函数vector.size()表示vector中实际元素的数量。
vector的长度是不确定的,当往vector添加元素时,如果vector后的连续空间不足以插入元素,vector会重新申请一段更长的空间。
vector.capacity()表示在不需要重新分配内存的情况下,vector能容纳的最多元素个数。
若需重新分配空间,新的vector.capacity()会变为原值的2倍(经测试),以避免用户频繁插入元素导致vector需要频繁重新分配内存。
void assign(const_iterator first,const_iterator last);
复制first-last至vector,此举会删除vector中原有的所有元素。
void assign(size_type n,const T& x = T());
将n个x置入vector,删除所有元素。
at(n)
同 vector[n],访问第n个元素,但会检查是否越界,并抛出异常
back()
返回最后一个元素。
begin()
返回第一个元素的迭代器,*begin()为第一个元素
capacity()
在不需要重新分配内存的情况下,vector能容纳的最多元素个数。
cbegin()
返回const_iterator,只可访问第一个元素,不可修改
cend()
返回const_iterator,只可访问最后一个元素,不可修改
clear()
将size()置为0,capacity()不变。
crbegin()
rbegin()和cbegin()的结合。
crend()
cend()和rend()的结合。
data()
返回首元素指针(不是迭代器),这是vector是数组的最好说明。
emplace(iterator where, **args)
功能同insert(),但可以避免不必要的临时构造,args为构造参数。
emplace_back(**args)
功能同push_back(),参数为构造参数。
empty()
检查vector是否为空。
end()
返回最后一个元素下一个位置的迭代器,*end()越界
erase(it) erase(begin, end)
删除it;删除begin-end(迭代器)之间的元素;返回最后一个已删除元素位置的迭代器;
front()
返回第一个元素
get_allocator()
返回一个allocator,内存分配器,类似malloc函数对象。
insert(where, value)
重载比较多,没啥好说的
max_size()
在主机上,有可能的,最大的size();可能未到这个值,就已经没法添加元素了。
= 和 [ ]
[ ] 参考数组。
pop_back()
删除最后一个元素,无返回值。
push_back(n)
功能同emplace_back,将n放到vector末尾
rbegin()
返回一个reverse_iterator,此迭代器减小时,所指元素位置往后+1。
rend()
返回一个reverse_iterator,参考rbegin()。
reserve(n)
将capacity置为n,不改变size();例外:若n < size(),则capacity置为size()。(经测试)
resize(n)
将size()置为n,不改变capacity;例外:若 2*capacity > n > capacity(),capacity翻倍;
若n >= 2*capacity,capacity 置为 n。(经测试)
shrink_to_fit()
将capacity置为size。
size()
返回size
swap()
交换两个vector对象,实质上交换了vector.data()。