STL:标准模板库。包括:标准类,函数模板
六术语:
1.容器:用来存储和组织其他对象的对象。
例如:链表类,又如:vector 容器
优点:自动管理内存
共有六种容器:
vector , deque , list , map , set , bitset
2.容器适配器
包装了现有STL模板,实现更加的功能
例如:queue 和 stack
3.迭代器
行为与指针相似,类型是 容器<>::iterator
- 分为:
输入(只读)输出(只写)迭代器,前向迭代器,双向迭代器,随机访问迭代器
4.算法
函数模板,操作迭代器提供的对象
头文件有 ,
5.函数对象
重载()运算符,实现 operator()()的函数
谓词:返回 bool 类型值得函数。分为两类:单操作数 和 双操作数
头文件
6.函数适配器
矢量容器 使用实例:
涉及的几个函数:
1.begin() 返回指向第一个元素的迭代器
2.end() 返回指向最后一个元素的下一个位置的迭代器
3.rbegin() 返回指向最后一个元素的迭代器,类型 reverse_iterator
4.rend() 返回指向第一个元素的下一个位置的迭代器,类型同 rbegin(),
特别注意 对象.rend()-1 指向矢量的第0号元素,
理解:将 rend 当做 begin 来理解,只是rend 指向 begin 的前一位
1: #include
2: #include
3:
4: using namespace std;;
5:
6: int main()
7: {
8: vector<int> mydata;
9: mydata.push_back(25);//在矢量尾增加一个元素,参数为元素的值
10: cout< << '/t'< < //越界不检查 < <<
11:
12:
13: vector<int> mydata1(100);
14: cout< << '/t'< << '/t'< < //默认初始化为0, < << <<
15:
16:
17: vector<int> mydata2(10,-1);
18: cout< << '/t'< << '/t'< < //构造时,第二个参数为默认初始值 < << <<
19:
20: vector<int> mydata3;
21: mydata3.reserve(10);//不初始化?使用原来内存的内容?
22: cout<
<
<>
<
<>
23:
24:
25: int a[]={0,1,2,3,4,5,6};
26: vector<int> mydata4(a,&a[6]);
27: //必须用两个指针初始化矢量, 第二个参数指向要使用的最后一个元素的下一个元素,&a[6] 可以用 a+6代替
28:
29: cout< << '/t'< < <> < <> <<
30: vector<int> mydata5(mydata4.begin(),mydata4.end());//end()指向最后一个元素的下一个元素
31:
32: vector<int> mydata6(mydata4.rbegin(),mydata4.rend());
33: //rbegin将返回指向最后一个元素的迭代器,rend将返回指向第一个元素的下一个位置的迭代器,这两种迭代器均称为逆向迭代器
34:
35:
36:
37: return 0;
38: }
对以上代码的一些备注:
1.VC6.0中不进行越界检查,但在VS2008中要进行越界检查的,以上程序在VS2008中可以运行,但程序会崩溃
2.VS2008中编译通过,但在VC6.0中使用 rbegin 和 rend 初始化的 mydata6 编译不通过
3.VS2008中,未初始化的矢量也不能访问,会报错 “矢量下标越界”vector subscript out of range
但在VC6.0中却可以正常访问
reserve()函数该如何使用呢?如何进行初始化?