C++ —— vector容器
一、创建容器
vector() // 创建一个空vector
vector(int nSize) // 创建一个vector,元素个数为nSize
vector(int nSize,const t& t) // 创建一个vector,元素个数为nSize,且值均为t
vector(const vector&) // 拷贝构造函数
vector(begin,end) // 复制另一个数组[begin,end)区间内的元素到vector中
二、vector实现二维数组
1. 定义二维数组
- 利用push_back()
int main()
{
vector<vector<int>> v;
vector<int> a;
a.push_back(1);
a.push_back(2);
vector<int> b;
b.push_back(3);
b.push_back(4);
v.push_back(a);
v.push_back(b);
return 0;
}
- 直接定义一个二维数组
//定义一个5行3列的数组
int main()
{
int i = 0;
int j = 0;
vector<vector<int>> array(5);
for (i = 0; i < array.size(); i++)
array[i].resize(3);
return 0;
}
2. 遍历二维数组
- 使用迭代器
void ergodic_with_iterator(vector<vector<int>> v)
{
if (v.empty())
return;
vector<vector<int>>::iterator iter;
vector<int>::iterator it;
vector<int> tmp;
for (iter = v.begin(); iter != v.end(); ++iter)
{
tmp = *iter;
for (it = tmp.begin(); it != tmp.end(); it++)
cout << *it << " ";
}
}
- 使用下标
void ergodic_with_index(vector<vector<int>> v)
{
if (v.empty())
return;
for (int i = 0; i < v.size(); i++)
{
for (int j = 0; j < v[0].size(); j++)
cout << v[i][j] << " ";
}
}
三、重点接口介绍
1. resize()
void resize (size_type n, value_type val = value_type());
调整数组的容量,接受两个参数。
1. 如果 n < v.size(),则将其元素个数减少到n个,销毁后面那些超出的元素。
2. 如果 v.size() < n < v.capacity(),扩大size(),新增的元素值为val。
3. 如果 n > v.capacity(),对数组进行扩容,新增的元素值为val。
2. reserve()
void reserve (size_type n);
扩大数组容量,如果n > v.capacity(),给数组新开辟一块容量为n的空间,把原数据拷贝至新空间;如果n<=v.capacity(),则不进行任何操作。
3. operator[]
reference operator[] (size_type n);
const_reference operator[] (size_type n) const;
返回数组中下标为n的元素的引用。该函数有两种形式,普通的可以通过返回值修改v[n]的值,加const不能通过返回值修改。如果n超出数组范围,直接断言报错。与它类似的还有at()
函数,该函数出现越界情况是抛出异常。
4. assign()
(1) void assign(const_iterator first,const_iterator last);
(2) void assign(size_type n,const T& x = T());
(1) 将区间[first,last)的元素赋值到当前的vector容器中
(2) 赋n个值为x的元素到vector容器中,这个容器会清除掉vector容器中以前的内容。
vector<int> first;
vector<int> second;
vector<int> third;
first.assign(7, 100); // 7 ints with a value of 100
vector<int>::iterator it;
it = first.begin() + 1;
second.assign(it, first.end() - 1); // the 5 central values of first
int myints[] = { 1776, 7, 4 };
third.assign(myints, myints + 3); // assigning from array.
5. insert()
(1) iterator insert (iterator position, const value_type& val);
(2) void insert (iterator position, size_type n, const value_type& val);
(3) template <class InputIterator>
void insert (iterator position, InputIterator first, InputIterator last);
(1) 在指定位置position前插入值为val的元素,返回指向这个元素的迭代器
(2) 在指定位置position前插入n个值为val的元素
(3)在指定位置position前插入区间[first, last)的所有元素
int main()
{
vector<int> v1(3, 100);
vector<int>::iterator it;
//(1)
it = v1.begin();
it = v1.insert(it, 200);
//(2)
v1.insert(it, 2, 300);
// "it" no longer valid, get a new one:
it = v1.begin();
//(3)
vector<int> v2(2, 400);
v1.insert(it + 2, v2.begin(), v2.end());
int myarray[] = { 501, 502, 503 };
v1.insert(v1.begin(), myarray, myarray + 3);
cout << "v1 contains:";
for (it = v1.begin(); it<v1.end(); it++)
cout << ' ' << *it;
cout << endl;
return 0;
}
6. erase()
(1) iterator erase (iterator position);
(2) iterator erase (iterator first, iterator last);
(1) 删除position处的元素。迭代器position指向不变,仍然指向被删除元素的位置,而被删除元素之后的所有元素都向前移动一位,也就是该迭代器实际上是指向了原来被删除元素的下一个元素。
(2) 删除区间[first, last)
内的所有元素。删除一段段元素之后,后面的元素(从last开始到vector.end())会被复制到被删除元素段开始的地方(first开始),而vector.end()也根据删除的元素个数往前移动。
注意:即使容器内容是指针对象,erase()也会清空指针对象指向的内容。
7. clear()
清空容器中的内容,但如果是指针对象的话,并不能清空其内容,必须要像以下方法一样才能达到清空指针对象的内容:
vector<int*> v;
for (int it = 0; it != v.size(); ++it)
{
delete v[it];
}
v.clear();
但也可以使用swap函数巧妙的完成清理内存:
v.clear();
v.swap(vector<int>());
四、其他接口简介
-
reference at(int pos);
返回pos位置元素的引用 -
reference front();
返回首元素的引用 -
reference back();
返回尾元素的引用 -
iterator begin();
返回向量头指针,指向第一个元素 -
iterator end();
返回向量尾指针,指向向量最后一个元素的下一个位置 -
reverse_iterator rbegin();
反向迭代器,指向最后一个元素 -
reverse_iterator rend();
反向迭代器,指向第一个元素之前的位置 -
bool empty() const;
判断向量是否为空,若为空,则向量中无元素 -
int size() const;
返回向量中元素的个数 -
int capacity() const;
返回当前向量张红所能容纳的最大元素值 -
int max_size() const;
返回最大可允许的vector元素数量值 -
void swap(vector&);
交换两个同类型向量的数据