STL典型使用--vector类模板
vector是将元素放在一个动态数组中加以管理的容器,vector可以随机存取元素(用[]操作符或at()直接存取),也支持迭代器存取元素;vector在尾部添加或移除元素十分高效,但是在中间或者头部插入/移除元素会比较费时。1. 增加/删除vector内的元素vector采用类模板实现,从而实现了算法和数据类型的分离,因此vector可以存放任何类型的元素(一个vector里的元素只能是一种..
·
vector是将元素放在一个动态数组中加以管理的容器,vector可以随机存取元素(用[]操作符或at()直接存取),也支持迭代器存取元素;vector在尾部添加或移除元素十分高效,但是在中间或者头部插入/移除元素会比较费时。
1. 增加/删除vector内的元素
vector采用类模板实现,从而实现了算法和数据类型的分离,因此vector可以存放任何类型的元素(一个vector里的元素只能是一种):
vector<int> intVec; //一个存放int的vector容器
class TT {};
vector<TT> vecTT; //一个存放TT对象的vector容器
vector<TT*> vecTTAddr; //一个存放TT对象地址的vector容器
需要注意,容器元素存放是按值复制的方式进行的,所以TT类必须提高TT的拷贝构造函数,以保证TT对象间拷贝正常。
示例1:
std::vector<int> intVec;
for (int i = 0; i < 5; ++i) {
intVec.push_back(i + 1); //尾插元素值
}
intVec.front() = 128; //修改头部数据,front()返回的是头部元素的引用
intVec.back() = 666; //修改尾部数据,back()返回的是尾部元素的引用
while (intVec.size() > 0) {
std::cout << intVec.back() << std::endl;
intVec.pop_back(); //删除尾部元素
}
vector有如下带参构造函数:
vector(beg, end); //构造函数将[beg, end)区间中的元素拷贝给本身。注意该区间是左闭右开区间
vector(n, elem); //构造函数将n个elem拷贝给本身
vector(const vector& vec); //拷贝构造函数
int arr[] = {0, 1, 2, 3, 4};
std::vector<int> int_vec1(arr, arr + 5);
std::vector<int> int_vec2(int_vec1.begin(),int_vec1.end());
std::vector<int> int_vec3(int_vec1.begin(), int_vec1.begin() + 3);
std::vector<int> int_vec4(3, 9);
std::vector<int> int_vec5 = int_vec1;
2. vector的[]的下标操作符
需要注意,进行[]操作之前要保证该地址已分配内存。
示例1:
std::vector<int> v1(10); //分配10个int的空间,其初始值为0
for (int i = 0; i < 10; ++i) {
v1[i] = i * 2;
}
for (int i = 0; i < 10; ++i) {
printf("%d\n", v1[1]);
}
3. vector的迭代器
迭代器是一个可遍历STL容器内全部或者部分元素的对象,它如同一个指针,指出容器中的一个特定位置。迭代器提供对容器中的对象的访问方法,并且可以定义了容器中对象的范围。
示例:
//正序遍历
for (std::vector<int>::iterator it = v1.begin(); it != v1.end(); ++it) {
std::cout << *it << std::endl;
}
//逆序遍历,.rbegin()等价于.end()
for (std::vector<int>::reverse_iterator rit = v1.rbegin(); rit != v1.rend(); ++rit) {
std::cout << *rit << std::endl;
}
迭代器由只读/非只读、正序/逆序组合如下4种:
typedef __gnu_cxx::__normal_iterator<pointer, vector> iterator;
typedef __gnu_cxx::__normal_iterator<const_pointer, vector> const_iterator;
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
typedef std::reverse_iterator<iterator> reverse_iterator;
4. vector的插入和删除
v1.clear(); //移除容器中所有数据
v1.erase(v1.begin(), v1.end()); //删除[begin(), end())区间的数据,返回下一个数据的位置
v1.erase(pos); //删除pos位置的数据,返回下一个数据的位置
示例:
for (std::vector<int>::iterator it = v1.begin(); it != v1.end(); ) {
if (*it == 6) {
it = v1.erator(it); //删除迭代器所指的元素时,该函数会自加it并且返回,所以for()循环中不能++it
}
else {
++it;
}
}
元素插入:
v1.insert(pos, elem); //在pos位置插入一个elem元素的拷贝,返回新数据的位置
v1.insert(pos, n, elem); //在pos位置插入n个elem元素的拷贝,无返回值
v1.insert(pos, begin(), end()); //在pos位置插入[begin(), end())区间的数据,无返回值
更多推荐
已为社区贡献1条内容
所有评论(0)