一、标准库的vector类型
vector是同一种类型的对象的集合
vector的数据结构很像数组,能非常高效和方便地访问单个元素
vector是一个类模板(class template)
vector不能存放引用。
template <
class Type,
class Allocator = allocator<Type>
>
class vector
要使用vector必须包含相关头文件
#include <vector>
using std::vector;
vector对象的初始化:
vector类定义了好几种构造函数
vector<T> v1; //vector保存类型为T的对象。默认构造函数v1为空
vector<T> v2(v1); // v2是v1的一个副本
vector<T> v3(n, i); //v3包含n个值为i的元素
vector<T> v4(n); //v4含有值初始化的元素的n个副本
vector<T> v5(v1.begin(), v1.end()); // iterating through v1
vector常用成员函数:
resize 和 reserve的区别:
void reserve(size_type n);
(1)如果n大于容器现有的容量(即capacity()),则需要在自由内存区为整个容器重新分配一块更大的连续空间,其大小为sizeof(T)*n,然后将容器内所有有效元素全部复制到新位置(调用拷贝构造函数),最后释放旧位置的所有存储空间并调整容器的成员指针。注意:容器的大小(即size())并没有发生改变。
(2)否则,什么也不做。
void resize(size_type n, const T& c = T());
(1)如果n大于容器当前的大小(即size()),则在容器的末尾插入n-size()个初值为c的元素,如果不指定初值,则用元素类型的默认构造函数来初始化(这可能引起内存重分配以及容器容量的扩张)。
(2)如果n小于容器当前的大小,则从容器的末尾删除size()-n 个元素,但不释放元素本身的内存空间,因此容量不变。
(3)否则,什么也不做。
e.g
vector<char> vec;
printf(”%zd %zd\n”, vec.size(), vec.capacity());
vec.resize(1024);
printf(”%zd %zd\n”, vec.size(), vec.capacity());
vec.resize(1300);
printf(”%zd %zd\n”, vec.size(), vec.capacity());
运行结果:
0 0 # 一开始size() 和capacity() 都是0
1024 1024 # resize(1024) 之后size() 和capacity() 都是1024
1300 2048 # resize(稍大) 之后capacity() 翻倍,相当于reserve(2048)
例程1:
#include <vector>
#include <iostream>
using namespace std;
typedef vector<int> INTVEC;
//void ShowVec(const INTVEC& v)
//{
// unsigned int i;
// for (i=0; i<v.size(); i++)
// {
// cout<<v[i]<<" ";
// }
// cout<<endl;
//}
//void ShowVec(INTVEC& v)
//{
// INTVEC::iterator it;
// for (it=v.begin(); it!=v.end(); ++it)
// {
// cout<<*it<<" ";
// }
//
// cout<<endl;
//}
void ShowVec(const INTVEC &v)
{
INTVEC::const_iterator it;
for (it = v.begin(); it != v.end(); ++it) //所有迭代器都重载了!=运算符,但有些没有重载<运算符。
{
cout << *it << " ";
}
cout << endl;
}
int main(void)
{
INTVEC v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
ShowVec(v);
return 0;
}
例程2:
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
typedef vector<int> INTVEC;
void ShowVec(const INTVEC &v)
{
INTVEC::const_iterator it;
for (it = v.begin(); it != v.end(); ++it)
{
cout << *it << " ";
}
cout << endl;
}
int main(void)
{
INTVEC v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
v.push_back(5);
v.push_back(3);
//cout<<v.back()<<endl;
//v.pop_back();
ShowVec(v);
//v.erase(v.begin()+2);
//v.erase(v.begin(), v.begin()+2);
v.erase(remove(v.begin(), v.end(), 3), v.end());
ShowVec(v);
return 0;
}
例程3:
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
typedef vector<int> INTVEC;
void ShowVec(const INTVEC &v)
{
INTVEC::const_iterator it;
for (it = v.begin(); it != v.end(); ++it)
{
cout << *it << " ";
}
cout << endl;
}
int main(void)
{
INTVEC v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
v.push_back(5);
v.push_back(3);
ShowVec(v);
//v.erase(remove(v.begin(), v.end(), 3), v.end());
INTVEC::iterator it;
for (it = v.begin(); it != v.end(); /*++it*/)
{
if (*it == 3)
{
it = v.erase(it); // erase返回的是当前删除元素的下一个元素
}
else
++it;
}
ShowVec(v);
return 0;
}
参考:
C++ primer 第四版
Effective C++ 3rd
C++编程规范