vector容器
vector容器封装了动态数组。
包含头文件: #include
vector类模板的声明:
template<class T, class Alloc = allocator<T>>
class vector{
private:
T *start_;
T *finish_;
T *end_;
……
}
构造函数
1)vector(); // 创建一个空的vector容器。
2)vector(initializer_list<T> il); // 使用统一初始化列表。
3)vector(const vector<T>& v); // 拷贝构造函数。
4)vector(Iterator first, Iterator last); // 用迭代器创建vector容器。
5)vector(vector<T>&& v); // 移动构造函数(C++11标准)。
6)explicit vector(const size_t n); // 创建vector容器,元素个数为n(容量和实际大小都是n)。
7)vector(const size_t n, const T& value); // 创建vector容器,元素个数为n,值均为value。
void testOne()
{
vector<int> v1;
cout <<" v1.capacity() = " << v1.capacity() <<"\tv1.size() = "<< v1.size() <<"\tv1.empty() = " << v1.empty() << endl;
vector<int> v2(10);
cout << " v2.capacity() = " << v2.capacity() << "\tv2.size() = " << v2.size() << "\tv2.empty() = " << v2.empty() << endl;
vector<int> v3(v2);
cout << " v3.capacity() = " << v3.capacity() << "\tv3.size() = " << v3.size() << "\tv3.empty() = " << v3.empty() << endl;
vector<int> v4(5,10);
cout << " v4.capacity() = " << v4.capacity() << "\tv4.size() = " << v4.size() << "\tv4.empty() = " << v4.empty() << endl;
vector<int> v5({ 1,2,3,4,5,6 });
cout << " v5.capacity() = " << v5.capacity() << "\tv5.size() = " << v5.size() << "\tv5.empty() = " << v5.empty() << endl;
for (int i = 0; i < v1.size(); i++) {
cout << v1[i] << " ";
}
cout << endl;
for (int i = 0; i < v2.size(); i++) {
cout << v2[i] << " ";
}
cout << endl;
for (int i = 0; i < v3.size(); i++) {
cout << v3[i] << " ";
}
cout << endl;
for (int i = 0; i < v4.size(); i++) {
cout << v4[i] << " ";
}
cout << endl;
for (int i = 0; i < v5.size(); i++) {
cout << v5[i] << " ";
}
cout << endl;
}
特性操作
size_t max_size() const; // 返回容器的最大长度,此函数意义不大。
size_t capacity() const; // 返回容器的容量。
size_t size() const; // 返回容器的实际大小(已使用的空间)。
bool empty() const; // 判断容器是否为空。
void clear(); // 清空容器。
void reserve(size_t size); // 将容器的容量设置为至少size。
void shrink_to_fit(); // 将容器的容量降到实际大小(需要重新分配内存)。
void resize(size_t size); // 把容器的实际大小置为size。
void resize(size_t size,const T &value); // 把容器的实际大小置为size,如果size<实际大小,
void testTwo()
{
vector <int>v1({1,2,3});
cout << v1.size() << endl;
for (int i = 0; i < v1.size(); i++) {
cout << v1[i]<<" ";
}
cout << endl;
v1.clear();
cout << v1.size() << endl;
for (int i = 0; i < v1.size(); i++) {
cout << v1[i] << " ";
}
}
元素操作
T &operator[](size_t n);
const T &operator[](size_t n) const; // 只读。
T &at(size_t n);
const T &at(size_t n) const; // 只读。
T *data(); // 返回容器中动态数组的首地址。
const T *data() const; // 返回容器中动态数组的首地址。
T &front(); // 第一个元素。
const T &front(); // 第一个元素,只读。
const T &back(); // 最后一个元素,只读。
T &back(); // 最后一个元素。
void testTwo()
{
vector <int>v1({1,2,3});
cout << v1.size() << endl;
for (int i = 0; i < v1.size(); i++) {
cout << v1[i]<<" ";
}
cout << endl;
v1.clear();
cout << v1.size() << endl;
for (int i = 0; i < v1.size(); i++) {
cout << v1[i] << " ";
}
cout << "----------" << endl;
vector <int>v2({ 1,2,3 ,4,5,6 });
cout << v2.at(0) << " " << v2[2] << " " << endl;
cout << v2.data() <<" " << v2.data()+1<<endl; //一个Int占4字节
cout << v2.front() << " " << v2.back() << endl;
}
赋值操作
1)vector &operator=(const vector<T> &v); // 把容器v赋值给当前容器。
2)vector &operator=(initializer_list<T> il); // 用统一初始化列表给当前容器赋值。
3)void assign(initializer_list<T> il); // 使用统一初始化列表赋值。
4)void assign(Iterator first, Iterator last); // 用迭代器赋值。
5)void assign(const size_t n, const T& value); // 把n个value给容器赋值。
void testThree()
{
vector<int> v1;
v1 = { 1,2,3,4,5 }; // 使用统一初始化列表赋值。
for (int ii = 0; ii < v1.size(); ii++) cout << v1[ii] << " ";
cout << endl;
vector<int> v2;
v2 = v1; // 把容器v1赋值给当前容器。
for (int ii = 0; ii < v2.size(); ii++) cout << v2[ii] << " ";
cout << endl;
vector<int> v3;
v3.assign({ 1,2,3,4,5 }); // 用assign()函数给当前容器赋值,参数是统一初始化列表。
for (int ii = 0; ii < v3.size(); ii++) cout << v3[ii] << " ";
cout << endl;
}
交换操作
void swap(vector<T> &v); // 把当前容器与v交换。
插入和删除
1)void push_back(const T& value); // 在容器的尾部追加一个元素。
2)void emplace_back(…); // 在容器的尾部追加一个元素,…用于构造元素。C++11
3)iterator insert(iterator pos, const T& value); // 在指定位置插入一个元素,返回指向插入元素的迭代器。
4)iterator emplace (iterator pos, …); // 在指定位置插入一个元素,…用于构造元素,返回指向插入元素的迭代器。C++11
5)iterator insert(iterator pos, iterator first, iterator last); // 在指定位置插入一个区间的元素,返回指向第一个插入元素的迭代器。
6)void pop_back(); // 从容器尾部删除一个元素。
7)iterator erase(iterator pos); // 删除指定位置的元素,返回下一个有效的迭代器。
8)iterator erase(iterator first, iterator last); // 删除指定区间的元素,返回下一个有效的迭代器。
vector<AA> v1(10);
cout <<" v1.size() = " << v1.size() ;
cout <<"\t\tv1.data() = " << v1.data() << endl;
AA c(18,"西施1");
AA d(19, "西施2");
AA e(20, "西施3");
//v1.push_back(c);
//v1.push_back(d);
//v1.push_back(e);
v1.emplace_back(c);
v1.emplace_back(d);
v1.emplace_back(e);
for (int i = 0; i < v1.size(); i++) {
cout << v1.at(i).m_bh << " " << v1.at(i).m_name << endl;
}
cout << endl;
vector嵌套
void testFour()
{
vector<vector<int>> vv; // 创建一个vector容器vv,元素的数据类型是vector<int>。
vector<int> v; // 创建一个容器v,它将作为容器vv的元素。
v = { 1,2,3,4,5 }; // 用统一初始化列表给v赋值。
vv.push_back(v); // 把容器v作为元素追加到vv中。
v = { 11,12,13,14,15,16,17 }; // 用统一初始化列表给v赋值。
vv.push_back(v); // 把容器v作为元素追加到vv中。
v = { 21,22,23 }; // 用统一初始化列表给v赋值。
vv.push_back(v); // 把容器v作为元素追加到vv中。
// 用嵌套的循环,把vv容器中的数据显示出来。
for (int ii = 0; ii < vv.size(); ii++)
{
for (int jj = 0; jj < vv[ii].size(); jj++)
cout << vv[ii][jj] << " "; // 像二维数组一样使用容器vv。
cout << endl;
}
}