cpp STL

Standard Template Library

一、头文件

使用C++的推荐写法:

#include <cstdio>
#include <cstring>    // string.h
#include <string>
#include <algorithm>  // 常用算法头文件
二、string

C++提供了string类型,可以直接对字符串进行操作

包含在头文件string中

#include <string>   // 区分cstring
三、sort
  1. 头文件 #include <algorithm>
  2. 默认排序为升序
  3. 可以对任意对象进行排序,对于内置类型直接排序,自己定义的类型需要定义<运算符
  4. 排序对象可以是普通数组,也可以是vector
  5. 函数原型:
void sort(begin_add, end_add, cmp)
// 表述形式:
    sort(a, a + len);   // char/int/double a[]
	sort(s.begin(), s.end())  // string s
    sort(v.begin(), v.end())  // vector<typename> v
  1. 自定义排序方式
// char/int/double a[]
bool cmp(int x, int y) {
    if(x < y) return true;   // 升序
    else return false;
}

// class Test
class Test {
	public:
    	int i;
    	int j;
};
bool cmp(Text x, Text y) {
    if(x.i < y.i) return true;
    else if(x.i > y.i) return false;     // 按照i升序排序
    else {
        if(x.j > y.j) return true;    
        else return flase;               // 在i相同时按照j降序排序
    }
}
四、sstream
  • 头文件#include <sstream>中包括stringstream类,进行流的输入输出操作
  • 常用操作:读一行,输出输入未知数量整数的和
#include <sstream>
#include <iostream>
using namespace std;
int main(void) {
    string line;
    while(getline(cin, line) {     // 从cin按行读入直至结束
        stringstream ss(line);     // 将line的数据重新定义为流ss
        int x, sum = 0;
        while(ss >> x) sum += x;
        cout << sum << "\n";
    }
}
  • 流的清空:
stringstream ss;
ss.clear();
五、iterator
  • 对于不支持下标访问的容器可以用iterator进行迭代,事实上推荐用迭代器进行容器的遍历
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(void) {
    vector<string> :: iterator it;    // it可以读写vector<string>元素
    vector<string> v;
    
    // 正序迭代
    for(vector<string> :: iteraotr it = v.begin(); it != v.end(); it++) {
   		/* 其他操作 */
    }
    
    // 逆序迭代
    for(vector<string> :: reverse_iterator it = v.rbegin(); it != v.rend(); it++) {
        /* 其他操作 */
    }
}
  • 迭代器的失效
// erase造成的迭代器失效
// 正确写法
std::vector<int> Vec;
std::vector<int>::iterator itVec;
for( itVec = Vec.begin(); itVec != Vec.end(); )
{
      if( WillDelete( *itVec) )
          itVec = Vec.erase( itVec); // erase返回下一个迭代器的值
      else itList++;
}
  • 迭代器访问容器元素:
// list vector set 
list<int>::iterator it;   *it;
// map
map<int, int>::iterator it; it->first; it->second;
  • erase函数释放迭代器:不可重复释放,对于释放过一次的迭代器再次释放会炸掉

  • 访问迭代器的下一个元素用next()函数

六、vector
  1. 包含在头文件 #include <vector> 中
  2. 定义
vector<储存的类型> 容器名;
vector<string> v;
  1. 成员函数:
vector<int> v;
v.front()        //返回首个元素
v.back()         //返回尾部元素
v.push_back()    //在末尾添加一个函数
v.pop_back()     //弹出最后一个元素
    
v.size()         //返回返回容器中元素个数    
v.empty()        //判断是否为空   
v.clear()        //清空容器	  
    
v.insert()       //在指定位置插入元素
v.erase()        //在指定位置删除元素

// insert函数详细用法
    // v = [1,2,3,4]    v1 = [5,6]
	v.insert(v.begin() + 1, 5);   // 1 5 2 3 4
	v.insert(v.begin() + 1, {5,6,7}); // 1 5 6 7 2 3 4
	v.insert(v.begin() + 1, 2, 5);    // 1 5 5 2 3 4
	v.insert(v.begin() + 1,  v1.begin(), v1.end())  // 1 5 6 2 3 4 
七、set
  1. 包含在头文件 #include <set>中
  2. 自动有序(升序),不含重复元素的容器
  3. 定义
set<储存的类型> 容器名;
set<int> s;
  1. 成员函数:
set<int> s; 
s.insert()        // 插入元素并自动排序去重,复杂度O(logN)
s.erase()         // 删除元素
    
s.count()         // 返回值为value的元素的个数,1或0    
s.find()          // 返回迭代器,复杂度为O(logN)

s.size()          //返回返回容器中元素个数    
s.empty()         //判断是否为空   
s.clear()         //清空容器	

s.lower_bound()   // 返回指向大于(或等于)某值的第一个元素的迭代器
八、map
  1. 包含在头文件 #include <map>中
  2. map中元素是自动按key升序排序(从小到大)
  3. map是key到value的映射,重载了[]运算符,类似于数组的高级版
  4. 定义
map<key, value> m;
  1. 成员函数:
typedef map<string, int> MyMap;
MyMap mymap;

// 操作对象为key
mymap.insert() 
mymap.erase()
    
mymap.count()
mymap.find()

mymap.size()         
mymap.empty()     
mymap.clear()         
  1. insert详细用法:
#include <iostream>
#include <algorithm>
#include <string>
#include <map>
using namespace std;
typedef map<string, int> monthMap;

void print(monthMap monthmap) {
	for(map<string, int>::iterator it = monthmap.begin(); it != monthmap.end(); it++) {
		cout << it->first << " " << it->second << endl;   // iterator访问map元素方法
	}
}

int main(void) {
// 直接赋值法
	monthMap monthmap1;
	monthmap1["aaa"] = 1;
	monthmap1["bbb"] = 2;
	monthmap1["ccc"] = 3;
	print(monthmap1);

// insert插入
	// insert pair data
	monthMap monthmap2;
	monthmap2.insert(pair<string, int>("aaa", 11));
	monthmap2.insert(pair<string, int>("bbb", 22));
	monthmap2.insert(pair<string, int>("ccc", 33));
	print(monthmap2);

	// insert value_type data
	monthMap monthmap3;
	monthmap3.insert(map<string, int>::value_type("aaa", 111));
	monthmap3.insert(monthMap::value_type("bbb", 222));
	monthmap3.insert(monthMap::value_type("ccc", 333));
	print(monthmap3);
}
  1. find
// 查找的对象是it->first,可以理解为原本的数组下标
	monthMap monthmap;
	monthmap["aaa"] = 1;
	monthmap["bbb"] = 2;
	monthmap["ccc"] = 3;
	cout << monthmap.count("aaa") << endl;         // return 1|0
	monthMap::iterator it = monthmap.find("aaa");  // return iterator
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++ STLC++标准模板库(Standard Template Library)的简称。它是C++的一个重要组成部分,提供了一系列的通用模板类和函数,用于处理常见的数据结构算法问题。 学习C++ STL有以下几个方面的好处: 1. 提高开发效率:STL提供了大量现成的数据结构算法,比如向量(vector)、链表(list)、队列(queue)、堆栈(stack)等,以及排序、查找、计数、遍历等算法。使用STL可以避免重复造轮子的过程,通过简单的调用就可以快速编写高效的代码,提高开发效率。 2. 提高代码质量:STL是由专业的C++程序员设计和实现的,其设计遵循了面向对象的思想,并使用了模板元编程等技术。使用STL可以提高代码的模块化程度,减少重复代码,使代码更加清晰、简洁和可维护。 3. 为学习其他编程语言打下基础:STL采用了一种通用、抽象的设计,其思想和理念对于学习其他编程语言也是有借鉴意义的。通过学习STL,可以更好地理解数据结构算法的设计与实现,为学习其他编程语言打下坚实的基础。 要学习C++ STL,可以从以下几个方面入手: 1. 理解STL的组成部分:了解STL的组成部分,包括容器(container)、迭代器(iterator)、算法(algorithm)、函数对象(function object)、适配器(adapter)等。理解它们之间的关系和作用,掌握各个组成部分的用法和特点。 2. 学习STL的常用容器和算法:熟悉STL提供的常用容器和算法,如向量(vector)、链表(list)、队列(queue)、堆栈(stack)等,以及排序、查找、计数、遍历等算法。了解其基本的操作和用法,掌握它们的时间复杂度和使用场景。 3. 理解STL内部实现原理:了解STL内部的实现原理,包括对容器和算法的底层实现,例如迭代器的实现、算法的实现方式和优化等。理解这些原理有助于更好地理解和使用STL,以及优化代码性能。 总之,学习C++ STL对于提高C++编程能力和开发效率非常重要。通过学习STL,可以更好地掌握C++数据结构算法,提高代码质量和可维护性,为进一步学习和应用其他编程语言打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值