开发成长之路(11)-- STL常用函数大集合

举报
看,未来 发表于 2021/05/06 01:26:46 2021/05/06
【摘要】 再好的编程技巧,也无法让一个笨拙的算法起死回生。 特定的算法往往搭配特定的数据结构。换言之,特定的数据结构是为了实现某种特定的算法。 文章目录 vector 部分list部分map/multimapset/multisetunordered_set/unordered_multisetunordered_map/unordered...

再好的编程技巧,也无法让一个笨拙的算法起死回生。


特定的算法往往搭配特定的数据结构。换言之,特定的数据结构是为了实现某种特定的算法。



vector 部分

#include <vector>


vector<int> v1 = v2;  //深拷贝构造
vector<int> v1 = {0,1,2,3};  //initializer_list初始化
vector<int> v1(v2.begin(), v2.end());  //vector或array初始化
vector<int> v1(7);  //初始化有7个元素的vector
vector<int> v1(7, 3) //初始化有7个3的vector
vector<int> v1(r, vector<int>(c, 0))  //初始化r行c列全为0的矩阵

v1.clear();  //清空
v1.size();   //返回元素数量
v1.empty();  //是否为空
v1.front();  //访问第一个元素
v1.back();   //访问最后一个元素
v1.push_back(100);  //末尾插入元素
v1.pop_back();  	//清除末尾元素
iter = v1.insert(v1.begin(), 100);  //在vector最前面插入100
iter = v1.insert(v1.begin(), v2.begin(), v2.end());  //插入另一个数组
iter = v1.erase(v1.begin()+2);  //erase一个数
iter = v1.erase(v1.begin()+2, v1.begin()+5); //erase一个区间

  

list部分

list<int> l1 = l2; //深拷贝构造
list<int> l1 = {0,1,2,3};  //initializer_list初始化
list<int> l1(l2.begin(), l2.end());  
list<int> l1(7); //初始化有7个元素的list
list<int> l1(7, 3) //初始化有7个3的list

l1.clear(); //清空
l1.size(); //返回元素数量
l1.empty(); //是否为空
l1.front(); //访问第一个元素
l1.back(); //访问最后一个元素
l1.push_back(100);  //末尾插入元素
l1.pop_back();  //清除末尾元素

iter = l1.insert(l1.begin(), 100); //在list最前面插入100
iter = l1.insert(l1.begin(), l2.begin(), l2.end());  //插入另一个数组
iter = l1.erase(l1.begin()+2); //erase一个数
iter = l1.erase(l1.begin()+2, l1.begin()+5); //erase一个区间

  

map/multimap

#include <map>

map<int, string> m1 = {{2015, "Tom"}, {2016, "Jim"}};   //构造函数

m1.clear();   //清空
m1.size();   //返回元素数量
m1.empty();  //是否为空
m1.at[2015] = "Tom"; //取值,会检查key是否存在
m1[2015] = "Tom";   //若key存在则修改value,若不存在则创建
m1.count(key); //返回相应key的count,可以用于判断map中是否存在该key
iter = m1.find(key);   //返回指向key的迭代器,用"!=m1.end()"判断是否找到

m1.lower_bound(key);   //返回指向首个不小于key的迭代器
m1.upper_bound(key);   //返回指向首个大于key的迭代器

m1.insert(make_pair(2015, "Tom"));  //使用pair插入
m1.insert(pair<int, string>(2015, "Tom"));
m1.insert({2015, "Tom"});   //initializer_list插入
m1.erase(key);  //返回被移除的元素的数量
m1.erase(iter);  //清除iter指向的元素
m1.erase(m1.begin()+2, m1.begin()+5);   //清除某个区间

  

set/multiset

//基于红黑树实现,有自动排序,插入O(logn),查找O(logn),删除O(logn)

#include <set>
#include <multiset>

set<int, less<int>> c1(c2);  //深拷贝构造
set<int, less<int>> c1(c2.begin(), c2.end());
set<int, less<int>> c1(c2.begin(), c2.end(), comp); //迭代器返回的元素依次排序

c1.clear();   //清空
c1.size();   //返回元素数量
c1.empty();  //是否为空
c1.count(elem);  //返回elem的count,可以用于判断set中是否有elem
c1.find(elem);   //返回指向elem的迭代器,用"!=c1.end()"判断是否找到
c1.lower_bound(elem);   //返回指向首个不小于elem的迭代器
c1.upper_bound(elem);   //返回指向首个大于elem的迭代器
c1.insert(elem); //插入单个elem
c1.insert(c2.begin(), c2.end()); //插入另一个set的某个区间
c1.erase(elem);  //返回被移除的元素的数量
c1.erase(iter);  //清除iter指向的元素
c1.erase(c1.begin()+2, c1.begin()+5);   //清除某个区间

  

unordered_set/unordered_multiset

//基于哈希表实现,插入O(n),查找O(n),删除O(n)
//代价占用内存比set/multiset略大一点点,内部元素不排序

#include <unordered_set>

//大部分函数同set/multiset
//由于内部元素不排序,不能使用lower_bound和upper_bound

  

unordered_map/unordered_multimap

//基于哈希表实现,插入O(n),查找O(n),删除O(n)
//代价占用内存比map/multimap略大一点点,内部元素不排序

#include <unordered_map>

//大部分函数同map/multimap
//由于内部元素不排序,不能使用lower_bound和upper_bound

  

string

#include <string>

string s1("hello"); //与下一行效果相同
string s1 = "hello";
string s1(4, '='); //生成4个'='组成的字符串
string s1(s2, 0, s2.size());  //拷贝另一个字符串的某个区间初始化

s1.clear(); //清空
s1.size();   //返回字符串长度,与下一行效果相同(不计'\0')
s1.length();
s1.empty();  //是否为空
s1.c_str(); //返回const char*形式
s1.substr(0, s1.size()); //返回指定区间内的子串,深拷贝
s1.append(s2, 0, s2.size()); //字符串后接另一个字符串的某个区间

to_string(100); //数值型转字符串
stoi("100"); //字符串转整型
stod("0.1"); //字符串转浮点型

  

其他

#include <algorithm>

min(a, b, comp); //取最小
max(a, b, comp);
min({a,b,c,d}, comp);
max({a,b,c,d}, comp);
swap(a, b);  // 交换
reverse(v.begin(), v.end()); //翻转

sort(v1.begin(), v1.end(), comp);   //不稳定排序
stable_sort(v1.begin(), v1.end(), comp); //稳定排序
//comp函数举例
bool cmp_less(const int& a, const int& b) { return a < b;
}


iter = find(v1.begin(), v1.end(), elem); //查找等于elem的元素
iter = search(v1.begin(), v1.end(), v2.begin(), v2.end()); //在v1中查找是否有区间包含v2,若没找到,返回v1.end()


  

文章来源: lion-wu.blog.csdn.net,作者:看,未来,版权归原作者所有,如需转载,请联系作者。

原文链接:lion-wu.blog.csdn.net/article/details/116430959

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。