首页 > 代码库 > C++学习之STL(持续更新)

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.121     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.229     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+huanghe40     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);//error14     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");//back24     lst.push_front("shenzhen");//front25     //inset one26     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 nums40     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);//重置capacity40     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:字符插入到某些位置,并替换已经存在的字符;

 

C++学习之STL(持续更新)