C++学习STL之顺序容器(持续更新)

STL 标准模板库

 标准模板库(Standard Template Library,缩写:STL)是一个C++软件库,  包括5个组件,分别是:算法、容器、迭代器,函数和适配器。  

 一:容器之初始化:

1.直接初始化一个空的容器;

2.用一个容器去初始化另一个容器;

3.指定容器的初始大小;

4.指定容器的初始大小和初始值;

5.用一对迭代器范围去初始化容器。

 示例代码如下:

 1 #include <iostream>
 2 #include <string>
 3 #include <vector>
 4 #include <fstream>
 5 #include <algorithm>
 6 using namespace std;
 7 
 8 void print(vector<string> &vec)
 9 {
10     for(vector<string>::iterator it = vec.begin(); 
11         it != vec.end();
12         ++it)
13     {
14         cout << *it << endl;    
15     }
16 }
17 
18 int main(int argc, const char *argv[])
19 {
20     vector<string> vec ;//num.1
21     vec.push_back("changjiang");
22     vec.push_back("huanghe");
23     vec.push_back("dahai");
24     vec.push_back("beijing");
25     vec.push_back("shanghai");
26     vec.push_back("guangdong");
27 
28     vector<string> vec2(vec); //num.2
29     cout<< "num2:" << endl ;
30     print(vec2); 
31 
32     vector<string> vec4(4, "test");//num.4容器大小和初始值
33     cout << "num.4:" << endl ;
34     print(vec4); 
35     
36     vector<string>::iterator it1,it2 ;
37     it1 = vec.begin();
38     it2 = find(vec.begin(), vec.end(), "dahai");
39     vector<string> vec5(it1, it2);//num.5 changjiang+huanghe
40     cout << "num.5" << endl;
41     print(vec5); 
42 
43     return 0;
44 }

注意 (第二种与第五种初始化方式的区别):

//采用引用方式。

1):num.2 不仅要求是 容器类型(vector<string>) 而且要求 容器元素类型(string);

//采用值copy方式。

2):num.5 不要求  容器类型相同,对于 容器元素,要求能相互兼容即可

如 vector<int> vec

可以用 list<double>,vector<int>,list<int>


另外C++中,指针也可以当做迭代器,示例如下:

 1 //指针也可以做迭代器。
 2 int main(int argc, const char *argv[])
 3 {
 4     const size_t MAX_S = 4 ;
 5     string arr[MAX_S] = {"hello", "world", "foobar"};
 6 
 7     vector<string> vec(arr, arr + MAX_S);
 8 
 9     for(vector<string>::iterator it = vec.begin(); 
10         it != vec.end(); 
11         ++it)
12     {
13         cout << *it << endl;    
14     }
15     return 0;
16 }

二:容器元素的约束类型:

1、容器 元素 必须支持赋值操作;

2、元素类型的 对象 必须可以复制。

示例如下:

 1 //将构造函数设为私有成员函数
 2 class Stu
 3 {
 4     //根源
 5     private:
 6         Stu(const Stu&);
 7         Stu &operator = (const Stu&);
 8 
 9 };
10 
11 int main(int argc, const char *argv[])
12 {
13     vector<Stu> vec(10);//error
14     return 0;
15 }

三:迭代器(前面我们已经用过迭代器的部分操作,今天我们系统探讨):

1):四个特殊的迭代器成员:

c.begin() //指向容器C的第一个元素

C.end() //指向最后一个元素的下一个位置

C.rbegin() //返回一个逆序迭代器,指向容器c的最后一个元素

C.rend() //返回一个逆序迭代器,指向容器c的第一个元素的前面的位置

2):迭代器的基本操作:

*it 、it-> 、 ++it 、 --it  iter1 = iter2、iter2 != iter1

首先我们先介绍一个for循环

for(vector<string>::iterator it = vec.begin() ;

  it != vec.end();

  ++it)

{ cout << *it << endl ; }

上面代码的作用是:打印 容器vec 中的元素 至屏幕。

注意上述 for 循环中

vec.begin()是 第一个元素的位置。

vec.end() 是 最后一个元素的下一个位置。

3):迭代器的范围(左闭右开区间)的优点:

a、当 begin 与 end 相等时,迭代器范围为空;

b. 当 begin 与 end不相等时,迭代器范围内至少有一个元素,而且 begin 指向该区间中的第一元素。此外,通过若干次自增运算可以使 begin 的值不断增大,直到 fbegin == end 为止。

增加元素: 

示例代码如下:

 1 #include <iostream>
 2 #include <string>
 3 #include <list>
 4 #include <vector>
 5 #include <algorithm>
 6 using namespace std;
 7 
 8 //insert
 9 void print(const list<string> &lst)
10 {
11     for(list<string>::const_iterator it = lst.begin(); 
12         it != lst.end(); 
13         ++it)
14     {
15         cout << *it << " ";    
16     }
17     cout << endl ;
18 }
19 
20 int main(int argc, const char *argv[])
21 {
22     list<string> lst ;
23     lst.push_back("shanghai");//back
24     lst.push_front("shenzhen");//front
25     //inset one
26     cout <<"first" << endl;
27     print(lst);
28     
29     lst.insert(lst.begin(), "huaibei");
30     print(lst);
31 
32     lst.insert(lst.end(), "anhui");
33     print(lst);
34 
35     list<string>::iterator it = find(lst.begin(), lst.end(), "shanghai");
36     lst.insert(it, "fenghua");
37     print(lst);
38     
39     //insert nums
40     cout << "last" << endl;    
41     lst.insert(it, 3, "beijing");
42     print(lst);
43 
44     lst.insert(lst.end(), lst.begin(), lst.end());
45     print(lst);
46     return 0;
47 }

迭代器失效问题:
任何 insert 或者 push 操作都可能到时迭代器失效。当循环将元素插入到 vector或者list中,

程序必须确保在每次循环后都得到更新。

删除与查询 操作与insert 操作类似,不再赘述。

常用: lst.pop_back() 、lst.pop_frong() 、 lst.earse(it)(需要判断是否要返回下标)。

lst.erase( first, last)。lst.erase(lst.begin(), lst.end());

容器的容量问题:

代码如下:

 1 #include <iostream>
 2 #include <string>
 3 #include <vector>
 4 #include <fstream>
 5 using namespace std;
 6 
 7 void print(const vector<int> &vec)
 8 {
 9     for(vector<int>::const_iterator it = vec.begin();
10         it != vec.end(); 
11         ++it)
12     {
13         cout << *it << " ";    
14     }
15     cout << endl;
16 }
17 //resize相当于加人,减人。capacity没有变化(改变时2的倍数)
18 int main(int argc, const char *argv[])
19 {
20     vector<int> vec ;
21     vec.push_back(12);
22 
23     cout << vec.size() << endl ;
24     cout << vec.empty() << endl ;
25     
26     vec.resize(5);//加上4个数
27     cout << vec.size() << endl ;
28     print(vec); 
29     
30     vec.push_back(12);
31     vec.push_back(12);
32     vec.push_back(12);
33     vec.push_back(12);
34     vec.push_back(12);
35 
36     vec.resize(7);//减去三个数
37     print(vec);
38     
39     vec.reserve(20);//重置capacity
40     cout << vec.size()<< endl;
41     cout << vec.capacity() << endl ;
42 
43     return 0;
44 }


简述:

1):Vector和list的区别

Vector内部 采用顺序表实现,而list采用链表实现,所以二者的差别很大程度是顺序表和链表的差别。

2):截取字串substr;

3):Append:在string后面串接新的字符串;

4):Replace:字符插入到某些位置,并替换已经存在的字符;

原文地址:https://www.cnblogs.com/xfxu/p/3987300.html