简介
Vector是STL中最常见的容器,它是一种顺序容器,支持随机访问。Vector的内存是连续分配的,这一点和数组极其相似,不同的的地方是:数组是静态分配空间,一旦分配了大小,就不可能再改变;而vector是动态分配空间,随着元素的不断插入,它会按照自身的一套机制不断扩充自身的容量。
Vector的扩充机制:按照容器现在容量的一倍进行增长。Vector容器分配的是一块连续的内存空间,每次容器增长,并不是在原有连续的内存空间后面进行简单的叠加,而是重新申请一块更大的新内存,并把容器中现有的元素逐个复制过去,然后销毁旧的内存。这时原有的内存空间的迭代器已经失效,所以当操作容器时,迭代器要及时更新。
成员函数
复制控制
vector:vector()
构造函数:构造一个vector容器,根据构造函数的版本初始化容器中的元素。
vector:~vector()
析构函数:销毁容器中的元素,销毁创建vector容器时分配的分内存空间。
vector:opeartor=()
赋值操作符:为容器分配新的元素以代替当前容器中的元素,并相应的改变其大小。
示例程序
#include <iostream>
#include <vector>
using namespace std;
void
print(vector<int> vec)
{
vector<int>::iterator it;
for(it = vec.begin(); it != vec.end(); ++it)
{
cout << *it << " ";
}
cout << endl;
}
int
main(void)
{
// vector::vector construct
vector<int> vec1;
vector<int> vec2(5, 10);
vector<int> vec3(vec2.begin(), vec2.end());
vector<int> vec4(vec3);
int arr[] = {1, 2, 3, 4, 5};
vector<int> vec5(arr, arr + sizeof(arr)/sizeof(int));
cout << "vec2 : ";
print(vec2);
cout << "vec3 : ";
print(vec3);
cout << "vec4 : ";
print(vec4);
cout << "vec5 : ";
print(vec5);
// vector::operator=
vector<int> vec6 = vec5;
cout << "vec6 : ";
print(vec6);
return(0);
}
迭代器操作
vector::begin()/end()
begin()返回指向vector容器第一个元素的迭代器。如果容器为空,返回值不能被引用。end()返回指向vector容器最后一个元素的下一个位置的迭代器。如果容器为空,它的返回值和vector::begin一样。它们返回值类型为vector<>::
iterator。
vector::rbegin()/rend()
rbegin()返回一个倒序的迭代器,指向容器的最后一个元素。rend()返回指向vector容器第一个元素的前一个位置的迭代器。它们的返回值类型为vector<>::reverse_iterator。
vector::cbegin()/cend()
这两个函数是vector::begin/end函数的const版本,其返回值类型为vector<>::const_iterator。
vector::crbegin()/crend()
这两个函数是vector::rbegin/rend的const版本,其返回值类型为vector<>::const_reverse_iterator。
示例程序
#include <iostream>
#include <vector>
using namespace std;
int
main(void)
{
vector<int> vec;
for(int i = 0; i < 5; i++)
{
vec.push_back(i + 1);
}
// vector::begin end
cout << "iterator : ";
for(vector<int>::iterator it = vec.begin(); it != vec.end(); ++it)
{
cout << *it << " ";
}
cout << endl;
// vector::rbegin rend
cout << "reverse iterator : ";
for(vector<int>::reverse_iterator it = vec.rbegin(); it != vec.rend(); ++it)
{
cout << *it << " ";
}
cout << endl;
// vector::cbegin cend C++11
cout << "const_iterator : ";
for(vector<int>::const_iterator it = vec.cbegin(); it != vec.cend(); ++it)
{
cout << *it << " ";
}
cout << endl;
// vector::crbegin crend C++11
cout << "const_reverse_iterator : ";
for(vector<int>::const_reverse_iterator it = vec.crbegin(); it != vec.crend(); ++it)
{
cout << *it << " ";
}
cout << endl;
return(0);
}
Capacity
vector::size()
返回容器中元素的个数,其值不一定和容器的capacity相等。返回值类型为vector::size_type。
vector::max_size()
返回容器能存储元素个数的最大值。返回值类型为vector<>size_type。
vector::resize()
改变容器大小,使其能存储n个元素。如果n的值比容器size要小的话,容器将只保留前面的n个元素,后面的元素将被移除并销毁。如果n的值比capacity值大,函数将会为容器重新分配大小为n的空间。
vector::capacity()
返回容器实际被分配的存储空间大小。返回值类型为vector<>::size_type。
vector::empty()
判断一个容器是否为空,空返回true,否则返回false。
vector::reserve()
指定容器的capacity的大小。
vector::shrink_to_fit()
根据容器实际存储的元素数量将将容器capacity修改成合适的大小。
示例程序
#include <iostream>
#include <vector>
using namespace std;
void
print(vector<int> vec)
{
vector<int>::iterator it;
for(it = vec.begin(); it != vec.end(); ++it)
{
cout << *it << " ";
}
cout << endl;
}
int
main(void)
{
vector<int> vec;
// vector::size
vector<int>::size_type actual_size = vec.size();
cout << "The actual size : " << actual_size << endl;
// vector::capacity
vector<int>::size_type capacity_size = vec.capacity();
cout << "Vector capacity size : " << capacity_size << endl;
// vector::reserve
vec.reserve(100);
actual_size = vec.size();
cout << "The actual size : " << actual_size << endl;
capacity_size = vec.capacity();
cout << "Vector capacity size : " << capacity_size << endl;
//vector::push_back
for(int i = 0; i < 10; i++)
{
vec.push_back(i+1);
}
actual_size = vec.size();
cout << "The actual size : " << actual_size << endl;
capacity_size = vec.capacity();
cout << "Vector capacity size : " << capacity_size << endl;
// vector::shrink_to_fit C++11
vec.shrink_to_fit();
capacity_size = vec.capacity();
cout << "Vector capacity size : " << capacity_size << endl;
// vector::max_size
vector<int>::size_type max = vec.max_size();
cout << "Vector max_siz : " << max << endl;
// vector::empty
if(!vec.empty())
{
// vector::back()
cout << "The last value is : " << vec.back() << endl;
}
// vector::resize
vec.resize(5);
cout << "Vector size : " << vec.size() << endl;
cout << "vec : ";
print(vec);
vec.resize(8, 10);
cout << "Vector size : " << vec.size() << endl;
cout << "vec : ";
print(vec);
vec.resize(10);
cout << "Vector size : " << vec.size() << endl;
cout << "vec : ";
print(vec);
return(0);
}
Element access
vector::operator[]
返回容器位置n的元素的引用。
vector::at()
返回容器位置n的元素的引用。
vector::front()
返回容器第一个元素的引用。
vector::back()
返回容器会后一个元素的引用。
vector::data()
返回内存中容器实际存储地址的一个指针。
示例程序
#include <iostream>
#include <vector>
using namespace std;
int
main(void)
{
vector<int> vec(5);
// vector::operator[]
for(int i = 0; i < 5; i++)
{
vec[i] = i + 1;
}
cout << "operator[] : ";
for(int i = 0; i < 5; i++)
{
cout << vec[i] << " ";
}
cout << endl;
// vector::at
cout << "at : ";
for(int i = 0; i < 5; i++)
{
cout << vec.at(i) << " ";
}
cout << endl;
// vector::front
cout << "The front element of vec is : " << vec.front() << endl;
// vector::back
cout << "The back element of vec is : " << vec.back() << endl;
// vector::data C++11
int *p = vec.data();
cout << "The first element : " << *p << endl;
*p = 10;
p[1] = 20;
cout << "vector::data : ";
for(int i = 0; i < 5; i++)
{
cout << vec[i] << " ";
}
cout << endl;
}
Modifiers
vector::assign()
为vector容器分配新的内容,以代替vector中原来的内容,vector大小也随之改变。
vector::push_back()
在vector容器的尾部插入一个新的元素,将vector的大小加1。
vector::pop_back()
删除vector容器的最后一个元素,将vector的大小减1。
vector::insert()
在指定vector容器指定位置插入一个元素,将vector的大小加1。
vector::erase()
删除vector容器中指定位置或范围的元素。
vector::swap()
交互两个容器的元素,两个容器类型必须相同,大小可以不同。
vector::clear()
清空一个vector容器,删除容器中所有的内容。
vector::emplace()
构造并插入一个元素到vector容器指定位置。
vector::emplace_back()
构造并插入一个元素到vector容器末尾。
示例代码
#include <iostream>
#include <vector>
using namespace std;
void
print(vector<int> vec)
{
vector<int>::iterator it;
for(it = vec.begin(); it != vec.end(); ++it)
{
cout << *it << " ";
}
cout << endl;
}
int
main(void)
{
vector<int> vec1;
vector<int> vec2;
vector<int> vec3;
vector<int>::iterator it;
// vector::assign
// void assign (size_type n, const value_type& val);
vec1.assign(3, 100);
// template <class InputIterator>
// void assign (InputIterator first, InputIterator last);
vec2.assign(vec1.begin(), vec1.end());
// void assign (initializer_list<value_type> il);
int arr[] = {1, 2, 3};
vec3.assign(arr, arr+3);
cout << "Vec1 size : " << vec1.size() << endl;
cout << "Vec2 size : " << vec2.size() << endl;
cout << "Vec3 size : " << vec3.size() << endl;
// vector::push_back
vec3.push_back(4);
cout << "The last number of vec3 : " << vec3.back()<< endl;
// vector::pop_back
cout << "vec3 last value : " << vec3.back() << endl;
vec3.pop_back();
cout << "vec3 : ";
print(vec3);
// vector::insert
it = vec3.begin();
// iterator insert (const_iterator position,
const value_type& val);
it = vec3.insert(it, 200);
cout << "vec3 : ";
print(vec3);
// iterator insert (const_iterator position, size_type n,
// const value_type& val);
vec3.insert(it, 2, 300);
cout << "vec3 : ";
print(vec3);
// template <class InputIterator> iterator
insert (const_iterator position,
// InputIterator first, InputIterator last);
vec3.insert(it+2, vec2.begin(), vec2.end());
print(vec3);
vec3.insert(vec3.begin(), arr, arr+3);
print(vec3);
// vector::erase
// erase the last one
vec3.erase(vec3.begin() + vec3.size() - 1);
print(vec3);
// erase the first 3 elements;
vec3.erase(vec3.begin(), vec3.begin() + 3);
print(vec3);
// vector::swap
vec3.swap(vec2);
cout << "vec2 contains : ";
print(vec2);
cout << "vec3 contains : ";
print(vec3);
// vector::emplace
vec3.emplace(vec3.begin(), 200);
cout << "vec3 : ";
print(vec3);
vec3.emplace(vec3.begin() + 2, 300);
cout << "vec3 : ";
print(vec3);
vec3.emplace(vec3.end(), 400);
cout << "vec3 : ";
print(vec3);
//vector::emplace_back
vec3.emplace_back(500);
print(vec3);
// vector::clear
vec3.clear();
cout << "vec2 size : " << vec3.size() << endl;
return(0);
}
vector<bool>
vector<bool>是vector的特殊版本,它的元素类型为bool。在使用上和vector普通版本基本一致,其中修改了swap()的用法,增加了filp()函数。
示例代码
#include <iostream>
#include <vector>
using namespace std;
void
print(vector<bool> vec)
{
for(vector<bool>::const_iterator it = vec.cbegin(); it != vec.cend(); ++it)
{
cout << *it << " ";
}
cout << endl;
}
int
main(void)
{
vector<bool> vec1;
vector<bool> vec2;
vector<bool>::iterator it;
vec1.push_back(true);
vec1.push_back(false);
vec1.push_back(true);
vec2.push_back(true);
vec2.push_back(false);
// vector<bool>::swap
vec1.swap(vec1[0], vec1[1]);
cout << "vec1 : ";
print(vec1);
vec2.swap(vec2.front(), vec2.back());
cout << "vec2 : ";
print(vec2);
vec1.swap(vec2);
cout << "vec1 : ";
print(vec1);
cout << "vec2 : ";
print(vec2);
// vector<bool>::flip
cout << "Before flip : ";
print(vec1);
vec1.flip();
cout << "After flip : ";
print(vec1);
return(0);
}