栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++ 常用库函数及STL整理(学习自用)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++ 常用库函数及STL整理(学习自用)

一、标准库类型string 1.定义和初始化
    string s1;              // 默认初始化,s1是一个空字符串
    string s2 = s1;         // s2是s1的副本,注意s2只是与s1的值相同,并不指向同一段地址
    string s3 = "hiya";     // s3是该字符串字面值的副本
    string s4(10, 'c');     // s4的内容是 "cccccccccc"
2.string上的操作 (1) getline读取一整行
    string s;    
    getline(cin,s);
(2) string的比较

支持 >, <, >=, <=, ==, !=等所有比较操作,按字典序进行比较。

(3)两个string对象相加

string s1 = "hello,  "", s2 = "worldn";
string s3 = s1 + s2;                    // s3的内容是 hello, worldn
s1 += s2;                               // s1 = s1 + s2

(4)字面值和string对象相加:

做加法运算时,字面值和字符都会被转化成string对象,因此直接相加就是将这些字面值串联起来:

string s1 = "hello", s2 = "world";      // 在s1和s2中都没有标点符号
string s3 = s1 + ", " + s2 + 'n';

当把string对象和字符字面值及字符串字面值混在一条语句中使用时,必须确保每个加法运算符的两侧的运算对象至少有一个是string:

string s4 = s1 + ", ";  // 正确:把一个string对象和有一个字面值相加
string s5 = "hello" + ", "; // 错误:两个运算对象都不是string

string s6 = s1 + ", " + "world";  // 正确,每个加法运算都有一个运算符是string
string s7 = "hello" + ", " + s2;  // 错误:不能把字面值直接相加,运算是从左到右进行的
3. 处理string对象中的字符

可以将string对象当成字符数组来处理:

    string s = "hello world";

    for (int i = 0; i < s.size(); i ++ )
        cout << s[i] << endl;
    
    for (char c: s) cout << c << endl;
4.操作string的常用函数 (1)find函数

基本用法

  string的find()函数用于找出字母在字符串中的位置。

find(str,position)
  • str:是要找的元素

  • position:字符串中的某个位置,表示从从这个位置开始的字符串中找指定元素(不填第二个参数,默认从字符串的开头进行查找)

返回值为目标字符的位置(第一个字符位置为0),当没有找到目标字符时返回npos

举例

//找到目标字符的位置
string s = "hello world!";
cout << s.find("e") << endl;
输出结果:1
//未找到目标字符
string s = "hello world!";
if (s.find("a") == s.npos) {
    cout << "not found" << endl;
}
输出结果:not found
//指定查找位置
string s = "hello world!";
cout << s.find("l",5) << endl;
输出结果:9

延伸用法

找到目标字符第一次出现和最后一次出现的位置

string s = "hello world!";
cout < 

 反向查找

string s = "hello world!";
cout << s.rfind("l") << endl;//即从后往前第一次出现"l"的位置
输出:
9

通常我们可以这样来使用,当正向查找与反向查找得到的位置不相同说明子串不唯一。

 查找所有子串在母串中出现的位置

//查找s 中flag 出现的所有位置。
	string s("hello world!");
    string flag="l";
    int position=0;
    int i=1;
    while((position=s.find(flag,position))!=string::npos)
    {
        cout<<"position  "< 
(2)replace 函数 

用法一:

用str替换指定字符串从起始位置pos开始长度为len的字符

string& replace (size_t pos, size_t len, const string& str)

int main()
{  
    string line = "this@ is@ a test string!";  
    line = line.replace(line.find("@"), 1, ""); //从第一个@位置替换第一个@为空  
    cout << line << endl;     
    return 0;  
}
输出:this is@ a that string!

 用法二:

用str替换 迭代器起始位置 和 结束位置 的字符

string& replace (const_iterator i1, const_iterator i2, const string& str);

int main()  
{  
    string line = "this@ is@ a test string!";  
    line = line.replace(line.begin(), line.begin()+6, "");  //用str替换从begin位置开始的字符  
    cout << line << endl;     
    return 0;  
} 
输出:is@ a that string!

用法三: 

用substr的指定子串(给定起始位置和长度)替换从指定位置上的字符串

string& replace (size_t pos, size_t len, const string& str, size_t subpos, size_t sublen)

  int main()  
{  
    string line = "this@ is@ a test string!";  
    string substr = "12345";  
    line = line.replace(0, 5, substr, substr.find("1"), 3); 
    //用substr的指定子串(从1位置数共3个字符)替换从0到5位置上的line  
    cout << line << endl;     
    return 0;  
} 
输出:123 is@ a test string!

二、STL 1. #include

vector是变长数组,支持随机访问,不支持在任意位置 O(1) 插入。为了保证效率,元素的增删一般应该在末尾进行。

(1)声明

vector a;                      // 相当于一个长度动态变化的int数组,默认为空
vectora(100)                   // a有100个值为0的元素
vector b[233];                 // 相当于第一维长233,第二位长度动态变化的int数组
vectorc                     // 相当于二维字符串数组
vectorc(10,"hello")         // c有10个值为hello的元素
vectorc(a.begin(),a.end())  // c是a的复制
struct rec{…};
vector d;                      // 自定义的结构体类型也可以保存在vector中

(2)迭代器

迭代器就像STL容器的“指针”,可以用星号*操作符解除引用。

一个保存int的vector的迭代器声明方法为:

vector::iterator it;
auto it = a.begin()      //auto自动推断类型

vector的迭代器是“随机访问迭代器”,可以把vector的迭代器与一个整数相加减,其行为和指针的移动类似。可以把vector的两个迭代器相减,其结果也和指针相减类似,得到两个迭代器对应下标之间的距离。

(3) 遍历

begin函数返回指向vector中第一个元素的迭代器。例如a是一个非空的vector,则*a.begin()与a[0]的作用相同。

所有的容器都可以视作一个“前闭后开”的结构,end函数返回vector的尾部,即第n 个元素再往后的“边界”。*a.end()与a[n]都是越界访问,其中n = a.size()。

for (int i = 0; i < a.size(); i ++)
    cout << a[i] << endl;

for (vector::iterator it = a.begin(); it != a.end(); it ++)
    cout << *it << endl;

auto 

for (auto it=a.begin();it!=a.end();it++)
    cout << *it << endl;

for(auto x : a);

for(auto& x : a);

for(const auto& x : a);

(4) 插入删除操作

a.push_back(x)                         //把元素x插入到vector a的尾部。
a.insert(a.begin()+i,x)                //在第i个元素前面插入x
a.insert(a.end(),10,5)                 //在尾部插入10个值为5的元素
a.pop_back()                           //删除vector a的最后一个元素。
a.erase(a.begin()+i,a.begin()+j)       //删除区间[i,j-1]的元素
a.erase(a.begin()+2)                   //删除第三个元素
reverse(a.begin(),a.end())             //翻转数组
2. #include

头文件set主要包括set和multiset两个容器,分别是“有序集合”和“有序多重集合”,即前者的元素不能重复,而后者可以包含若干个相等的元素。set和multiset的内部实现是一棵红黑树,它们支持的函数基本相同。

(1) 声明

set s;
struct rec{…}; set s;  // 结构体rec中必须定义小于号
multiset s;

(2)迭代器

set和multiset的迭代器称为“双向访问迭代器”,不支持“随机访问”,支持星号*解除引用,仅支持++和--两个与算术相关的操作。

设it是一个迭代器,例如set::iterator it;

若把it ++,则it会指向“下一个”元素。这里的“下一个”元素是指在元素从小到大排序的结果中,排在it下一名的元素。同理,若把it --,则it将会指向排在“上一个”的元素。

(3) insert

s.insert(x)  //把一个元素x插入到集合s中,时间复杂度为 O(logn)O(logn)。

在set中,若元素已存在,则不会重复插入该元素,对集合的状态无影响。

(4) find

s.find(x)   //在集合s中查找等于x的元素,并返回指向该元素的迭代器。
//若不存在,则返回s.end()。
if(s.find(x)!=s.end())   //判断x是否在s中

(5) erase

设it是一个迭代器,s.erase(it)从s中删除迭代器it指向的元素,时间复杂度为 O(logn)O(logn)。

设x是一个元素,s.erase(x)从s中删除所有等于x的元素,时间复杂度为 O(k+logn)O(k+logn),其中 kk 是被删除的元素个数。

s.erase(it)   //删除迭代器it指向的元素
s.erase(x)    //删除s中的x

(6) count

s.count(x)返回集合s中等于x的元素个数,时间复杂度为 O(k+logn)O(k+logn),其中 kk 为元素x的个数。

s.count(x)    //返回s中x的数量

(7) lower_bound/upper_bound

这两个函数的用法与find类似,但查找的条件略有不同,时间复杂度为 O(logn)O(logn)。

s.lower_bound(x)    //查找大于等于x的元素中最小的一个,并返回指向该元素的迭代器。
s.upper_bound(x)    //查找大于x的元素中最小的一个,并返回指向该元素的迭代器。

(8)自定义插入规则(降序排列) 

//重载降序排列
struct cmp{
    bool operator() (const int &a,const int&b){
        return a>b;
    }
};

//定义方法
sets;
3. #include

map容器是一个键值对key-value的映射,其内部实现是一棵以key为关键码的红黑树。Map的key和value可以是任意类型,其中key必须定义小于号运算符。

(1)声明

map name;

//例如:
map vis;
map hash;
map, vector> test;

(2) size/empty/clear/begin/end

与vector,set类似

(3) insert/erase

与set类似,但其参数均是

pair。

(4) find

h.find(x)    //在变量名为h的map中查找key为x的二元组。

(5) []操作符

h[key]    //返回key映射的value的引用

时间复杂度为 O(logn)O(logn)。

[]操作符是map最吸引人的地方。

我们可以很方便地通过h[key]来得到key对应的value,还可以对h[key]进行赋值操作,改变key对应的value。

4. #include

头文件queue主要包括循环队列queue和优先队列priority_queue两个容器。

(1)声明

queue q;
struct rec{…}; queue q;                        //结构体rec中必须定义小于号
priority_queue q;                              // 大根堆
priority_queue, greater> q;   // 小根堆
priority_queue>q;

(2)循环队列queue

q.push(x)    // 从队尾插入
q.pop()     // 从队头弹出
q.front()   // 返回队头元素
q.back()    // 返回队尾元素

(3)优先队列priority_queue

q.push()    // 把元素插入堆
q.pop()     // 删除堆顶元素
q.top()     // 查询堆顶元素(最大值)
5. #include

头文件stack包含栈。声明和前面的容器类似

s.push(x)    // 向栈顶插入
s.pop()      // 删除栈顶元素,但不会返回
s.pop()      // 返回栈顶元素,但不会删除
6. #include

双端队列deque是一个支持在两端高效插入或删除元素的连续线性存储空间。它就像是vector和queue的结合。与vector相比,deque在头部增删元素仅需要 O(1)O(1) 的时间;与queue相比,deque像数组一样支持随机访问。

a[i]                // 随机访问
a.begin()/a.end()   // 返回deque的头/尾迭代器
a.front()/back()    // 队头/队尾元素
a.push_back(x)      // 从队尾入队
a.push_front(x)     // 从队头入队
a.pop_back()        // 从队尾出队
a.pop_front()       // 从队头出队
a.clear()           // 清空队列
7.include 

头文件包含list 链表结构

创建链表

listi;
list(10);

 操作方法

i.push_back(x);    //尾插法
i.push_front(x);   //头插法
i.insert(x);       //插入元素
reverse_iterator   //翻转链表
i.erase()            //删除一个元素 
i.remove()           //从list删除元素 
i.pop_back()         //删除最后一个元素 
i.pop_front()        //删除第一个元素 
sort()             //给list排序 
splice()           //合并两个list 
swap()             //交换两个list 
unique()           //删除list中重复的元素
三、常用函数 1.sort 2.max()/min(),element_max()/element_min()

头文件 #include

max()/min() 

常规用法:

C = max(A,B)   返回A和B中最大的值

用于求数组中的最大元素。暂时用到的语法形式有以下3种:

(1)C = max(A); 

(2)C = max(A, B);

(3)C = max(A, [], dim); 

描述:

(1)C = max(A) 返回数组不同维度的最大元素。如果A是一个向量,max(A)返回向量A中的最大元素;如果A是一个矩阵,max(A)将矩阵A的每一列视为向量,最后返回一个行向量,这个行向量的每个元素是对应列向量的最大元素;如果A是一个多维数组,max(A)将第一个尺寸不为1的维度里的值视为向量,然后返回每个向量的最大值。

(2)C = max(A, B) 返回一个数组,该数组的尺寸与A和B相同,该数组的元素取自A和B中的最大值。A和B的维度必须要匹配,或者它们都是标量。

(3)C = max(A, [], dim) 根据指定标量dim返回矩阵A中的最大元素。比如dim=1,则返回行向量,其中每个元素都是对应列的最大元素;比如dim=2,则返回列向量,其中每个元素都是对应行的最大元素。

语法1举例1:在数组中返回最大的数字
 
A = [1, 2, 3, 4, 5]
    A = 1 2 3 4 5
>>max(A)
    ans = 5
 
语法1举例2:在5*5的矩阵中,每列中找到最大的数返回成一个数组
 
>>A = magic(5)
    A = 
    17    24     1     8    15
    23     5     7    14    16
     4     6    13    20    22
    10    12    19    21     3
    11    18    25     2     9
>>max(A)
    ans = 23 24 25 21 22
语法3举例:第三个参数的1代表以列为单位比较,返回没一列的最大值组成行的数组,
          第三个参数的2代表以行为单位比较,返回没一行的最大值组成列的数组。
>>A = magic(3)
    A =
    8     1     6
    3     5     7
    4     9     2
>>max(A, [], 1)
    ans = 8 9 7
>>max(A, [], 2)
    ans =
    8
    7
    9

 

element_max()/element_min()

max_element是用来来查询最大值所在的第一个位置。

max_element有两种写法,

第一种是从头迭代器到尾迭代器用自己写的方法去比较。
第二种是直接用它自带的头迭代器到尾迭代器的比较大小。

#include 
#include 

using namespace std;
struct structs 
{
	bool operator() (int i, int j) 
{
 return i 
3.find() 
4.atoi() 

头文件#include

功能:把字符串转换成整型数,atoi()会扫描参数string字符串,跳过前面的空格字符串,直到遇上数字或正负号才开始做转换,而再遇到非数字或字符串‘’时才结束转换,并将结果返回,返回转换后的整型数。

    #include
    #include
    int main(void)
    {
        float n;
        char const *str="12345.67";
        n=atoi(str);
        printf("string=%sfloat=%fn",str,n);
        return 0;
    }
输出:string = 12345.67 float = 12345.000000
    #include
    #include
    int main()
    {
        char a[]="-100";
        char b[]="123";
    int c;
        c=atoi(a)+atoi(b);
        printf("c=%dn",c);
        return0;
    }
输出:c = 23

 

5.next_permutation
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1022895.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号