STL学习系列之二——序列容器(vector)
2012-02-07 23:45
417 查看
STL学习之二 序列容器(vector)
一、C++标准模板库提供了三种序列容器:vector、list、deque。类模板vector和deque都以数组为基础,类模板list实现了链表的数据结构。
STL中最流行的是类模板vector,它是一种更健壮的数据类型,相当于动态数组,能动态得改变数组的大小。
Vector和C和C++的原始数组不同。为什么不同呢?因为vector能够彼此赋值,基于指针的C风格的数组不支持这种用法,为什么呢?因为这些数组的名称是常量指针,不能作为赋值的目标。就像C数组一样,vector的下标并不执行自动范围检查,但模板vector通过at成员函数可以对数组下标范围进行检查,待会在例子中将会看到。呵呵
vector、list、deque各有各的高效使用范围:
vector用于在容器的后端高效的的插入,在中间插入和删除元素的效率很低;
list用于经常在容器的中间位置和两个端点进行插入和删除;
deque经常用于对容器的两端进行高效的插入和删除;
1、 vector序列容器
类模板vector提供的数据结构,具有连续的内存位置,这样,就能够通过下标运算符[]高效而直接的访问vector中的任何一个元素,就像C和C++的原始数组一样。
当vector的内存耗尽的时候,它会分配一块更大的连续内存区域,将原来的元素复制到心得内存中并销毁旧的内存。
下面将介绍使用vector和迭代器,直接上demo
输出结果为:
初始化数组大小是:0
初始化数组容量是:0
数组大小是:3
数组容量是:3
用指针输出数组:1 2 3 4 5 6
用迭代器输出vector:2 3 4
翻转vector中的元素:4 3 2
注:迭代器的行为就像指向元素的指针一样,它重载了运算符*,返回指向这个元素的引用。
操作vector元素的函数
直接上demo
输出结果为:
Vector元素包括:1 2 3 4 5 6
第一个元素是:1
最后一个元素是:6
改变后vector元素的内容为:7 22 2 10 4 5 6
Exception:invalid vector<T> subscript
清除第一个元素后为:22 2 10 4 5 6
清除所有的元素后,vector的元素isempty
清除前的内容:1 2 3 4 5 6
清楚后,vector isempty
注:front函数和begin函数的区别:front函数返回vector中第一个元素的引用,而begin函数返回一个随机访问迭代器,指向vector中的第一个元素;
back函数和end函数的区别:back函数返回vector中最后一个元素的引用,而end函数返回一个随机访问迭代器,指向vector的末尾;
一、C++标准模板库提供了三种序列容器:vector、list、deque。类模板vector和deque都以数组为基础,类模板list实现了链表的数据结构。
STL中最流行的是类模板vector,它是一种更健壮的数据类型,相当于动态数组,能动态得改变数组的大小。
Vector和C和C++的原始数组不同。为什么不同呢?因为vector能够彼此赋值,基于指针的C风格的数组不支持这种用法,为什么呢?因为这些数组的名称是常量指针,不能作为赋值的目标。就像C数组一样,vector的下标并不执行自动范围检查,但模板vector通过at成员函数可以对数组下标范围进行检查,待会在例子中将会看到。呵呵
vector、list、deque各有各的高效使用范围:
vector用于在容器的后端高效的的插入,在中间插入和删除元素的效率很低;
list用于经常在容器的中间位置和两个端点进行插入和删除;
deque经常用于对容器的两端进行高效的插入和删除;
1、 vector序列容器
类模板vector提供的数据结构,具有连续的内存位置,这样,就能够通过下标运算符[]高效而直接的访问vector中的任何一个元素,就像C和C++的原始数组一样。
当vector的内存耗尽的时候,它会分配一块更大的连续内存区域,将原来的元素复制到心得内存中并销毁旧的内存。
下面将介绍使用vector和迭代器,直接上demo
#include <iostream> using namespace std; #include <vector> template <typename T> void printVector(const vector<T> &integers2); int _tmain(int argc, _TCHAR* argv[]) { const int SIZE=6; int array[SIZE]={1,2,3,4,5,6}; //初始化数组 vector<int> integers; //下面两行演示了size和capacity函数的用法 cout<<"n初始化数组大小是:"<<integers.size(); cout<<"\n初始化数组容量是:"<<integers.capacity(); //push_back将一个元素添加到vector末尾,这个函数可用于所有的序列容器 integers.push_back(2); integers.push_back(3); integers.push_back(4); //此处结果按照道理应该是4,因为添加第一个元素时分配1个元素空间,添加第二个元素的时候,大小为2, //添加第三个元素的时候大小为4,它是以1、2、4、8......这样分配的,但是这里运行结果却是3,求解 cout<<"\n数组大小是:"<<integers.size(); cout<<"\n数组容量是:"<<integers.capacity(); //演示用指针和指针运算符输出数组的内容 cout<<"\n用指针输出数组"; for (int *ptr=array;ptr!=array+SIZE;ptr++) { cout<<*ptr<<' '; } cout<<"\n用迭代去输出vector:"; //调用printVector函数,通过迭代器输出vector对象的内容 printVector(integers); cout<<"\n翻转vector的元素:"; //const_reverse_iteratory用于逆向迭代vector vector<int>::const_reverse_iterator reverseIterator; vector<int>::const_reverse_iterator tempIterator=integers.rend(); for (reverseIterator=integers.rbegin();reverseIterator!=tempIterator;++reverseIterator) { cout<<*reverseIterator<<' '; } cout<<endl; system("pause"); return 0; } template<typename T> void printVector(const vector<T> &integers2) { typename vector<T>::const_iterator constIterator; for (constIterator=integers2.begin();constIterator!=integers2.end();++constIterator) { cout<<*constIterator<<' '; } }
输出结果为:
初始化数组大小是:0
初始化数组容量是:0
数组大小是:3
数组容量是:3
用指针输出数组:1 2 3 4 5 6
用迭代器输出vector:2 3 4
翻转vector中的元素:4 3 2
注:迭代器的行为就像指向元素的指针一样,它重载了运算符*,返回指向这个元素的引用。
操作vector元素的函数
直接上demo
#include <iostream> using namespace std; #include <vector> #include <algorithm> #include <iterator> #include <stdexcept> int _tmain(int argc, _TCHAR* argv[]) { const int SIZE=6; int array[SIZE]={1,2,3,4,5,6}; vector<int>integers(array,array+SIZE); ostream_iterator<int> output(cout," "); cout<<"vector元素包括:"; //来自标准库的copy算法,将vector对象integers的全部内容输出到标准输出 copy(integers.begin(),integers.end(),output); cout<<"\n第一个元素是:"<<integers.front()<<"\n最后一个元素是:"<<integers.back(); integers[0]=7; //设置第一个元素为7 integers.at(2)=10;//设置第二个位置的元素为10 //插入22作为第二个元素 integers.insert(integers.begin()+1,22); cout<<"\n改变后vector元素的内容为:"; std::copy(integers.begin(),integers.end(),output); //访问越界的元素 try { integers.at(100)=777; } catch(out_of_range &outOfRange) { cout<<"\n\nException: "<<outOfRange.what(); } //清除第一个元素 integers.erase(integers.begin()); cout<<"\n清除第一个元素后为:"; copy(integers.begin(),integers.end(),output); //清除保留的元素 integers.erase(integers.begin(),integers.end()); cout<<"\n清除所有的元素后,vector的元素 "<<(integers.empty()?"is":"is not")<<"empty"; //从数组中插入元素 integers.insert(integers.begin(),array,array+SIZE); cout<<"\n\n清除前的内容:"; copy(integers.begin(),integers.end(),output); integers.clear(); cout<<"\n清楚后,vector "<<(integers.empty()?"is":"is not")<<"empty"<<endl; system("pause"); return 0; }
输出结果为:
Vector元素包括:1 2 3 4 5 6
第一个元素是:1
最后一个元素是:6
改变后vector元素的内容为:7 22 2 10 4 5 6
Exception:invalid vector<T> subscript
清除第一个元素后为:22 2 10 4 5 6
清除所有的元素后,vector的元素isempty
清除前的内容:1 2 3 4 5 6
清楚后,vector isempty
注:front函数和begin函数的区别:front函数返回vector中第一个元素的引用,而begin函数返回一个随机访问迭代器,指向vector中的第一个元素;
back函数和end函数的区别:back函数返回vector中最后一个元素的引用,而end函数返回一个随机访问迭代器,指向vector的末尾;
相关文章推荐
- STL学习系列之二——序列容器(vector)
- STL学习系列之三——list序列容器
- STL学习系列之四——deque序列容器
- C++学习 STL之二:vector容器用法详解
- STL序列容器vector、deque、list和array学习笔记
- STL学习系列二:Vector容器
- STL要点学习(1)--vector容器
- STL有6种序列容器(vector, list, deque, queue, priority_deque, stack)
- STL学习——STL中的序列式容器及适配器总结(vector、list、deque、stack、queue)
- 初学者学习C++STL之vector容器
- c++ STL 系列之二 vector
- STL学习2——序列容器
- STL之二:vector容器用法详解
- STL学习笔记-vector容器(动态数组)
- STL学习系列之六—容器适配器
- STL学习笔记之 (二)容器 vector
- 标准模板库(STL)学习探究之vector容器
- STL系列之二_vector(其他用法代码演示)
- [C++再学习系列] 函数声明与STL容器构造
- STL学习笔记----3.容器 vector 和 deque