c++中string的常用函数+用法归纳

c++中string的常用函数+用法归纳

一. 基本形式
string str:生成空字符串

string s(str):生成字符串为str的复制品

string s(str, strbegin,strlen):将字符串str中从下标strbegin开始、长度为strlen的部分作为字符串初值

string s(cstr, char_len):以C_string类型cstr的前char_len个字符串作为字符串s的初值

string s(num ,c):生成num个c字符的字符串

string s(str, stridx):将字符串str中从下标stridx开始到字符串结束的位置作为字符串初值

eg:

string str1;               //生成空字符串
string str2("123456789");  //生成"1234456789"的复制品
string str3("12345", 0, 3);//结果为"123"
string str4("012345", 5);  //结果为"01234"
string str5(5, '1');       //结果为"11111"
string str6(str2, 2);      //结果为"3456789"

二. string的大小

  1. size()和length():返回string对象的字符个数,他们执行效果相同。
  2. max_size():返回string对象最多包含的字符数,超出会抛出length_error异常

三.字符串比较

  1. C ++字符串支持常见的比较操作符(>,>=,<,<=,==,!=),甚至支持string与C-string的比较(如 str<”hello”)。
    在使用>,>=,<,<=这些操作符的时候是根据“当前字符特性”将字符按字典顺序进行逐一得 比较。字典排序靠前的字符小,
    比较的顺序是从前向后比较,遇到不相等的字符就按这个位置上的两个字符的比较结果确定两个字符串的大小(前面减后面)
    同时,string (“aaaa”) <string(aaaaa)。

  2. 另一个功能强大的比较函数是成员函数compare()。他支持多参数处理,支持用索引值和长度定位子串来进行比较。
    他返回一个整数来表示比较结果,返回值意义如下:0:相等 1:大于 -1:小于 (A的ASCII码是65,a的ASCII码是97)

    // 前面减去后面的ASCII码,>0返回1,<0返回-1,相同返回0
    string A("aBcd");
    string B("Abcd");
    string C("123456");
    string D("123dfg");

    // "aBcd" 和 "Abcd"比较------ a > A
    cout << "A.compare(B):" << A.compare(B)<< endl;                          // 结果:1

    // "cd" 和 "Abcd"比较------- c > A
    cout << "A.compare(2, 3, B):" <<A.compare(2, 3, B)<< endl;                // 结果:1

    // "cd" 和 "cd"比较 
    cout << "A.compare(2, 3, B, 2, 3):" << A.compare(2, 3, B, 2, 3) << endl;  // 结果:0


    // 由结果看出来:0表示下标,3表示长度
    // "123" 和 "123"比较 
    cout << "C.compare(0, 3, D, 0, 3)" <<C.compare(0, 3, D, 0, 3) << endl;    // 结果:0

四.string的插入 (与vetor容器类似)

![在这里插入图片描述](https://img2020.cnblogs.com/blog/572188/202101/572188-20210119093822070-1954564548.png)
{
    string s1;

    // 尾插一个字符
    s1.push_back('a');
    s1.push_back('b');
    s1.push_back('c');
    cout<<"s1:"<<s1<<endl; // s1:abc

    // insert(pos,char):在制定的位置pos前插入字符char
    s1.insert(s1.begin(),'1');
    cout<<"s1:"<<s1<<endl; // s1:1abc
}

在这里插入图片描述
五.string拼接字符串:append() & + 操作符*

  basic_string &append( const char *str );
  basic_string &append( const basic_string &str, size_type index, size_type len );
  basic_string &append( const char *str, size_type num );
  basic_string &append( size_type num, char ch );
  basic_string &append( input_iterator start, input_iterator end );
  
在字符串的末尾添加str,
在字符串的末尾添加str的子串,子串以index索引开始,长度为len
在字符串的末尾添加str中的num个字符,
在字符串的末尾添加num个字符ch,
在字符串的末尾添加以迭代器start和end表示的字符序列.

{  
    string str1="I like C++";  
    string str2=",I like the world.";  
    string str3="Hello";  
    string str4("Hi");  
    //====================================  
    str1.append(str2);  
    str3.append(str2, 11, 7);  
    str4.append(5, '.');  
    //====================================  
    cout<<str1<<endl;  
    cout<<str3<<endl;  
    cout<<str4<<endl;  
    system("pause");  
    return 0;     





Hello World.
Hi.....

string 中还有个很常⽤的函数叫做 substr ,作⽤是截取某个字符串中的⼦串,⽤法有两种形式:


string s2 = s.substr(4); // 表示从下标4开始⼀直到结束
string s3 = s.substr(5, 3); // 表示从下标5开始,3个字符

六. string的删除:erase()*


1. iterator erase(iterator p);//删除字符串中p所指的字符

2. iterator erase(iterator first, iterator last);//删除字符串中迭代器

区间[first,last)上所有字符

3. string& erase(size_t pos = 0, size_t len = npos);//删除字符串中从索引

位置pos开始的len个字符

4. void clear();//删除字符串中所有字符

八.string的字符替换:*

1. string& replace(size_t pos, size_t n, const char *s);//将当前字符串

从pos索引开始的n个字符,替换成字符串s

2. string& replace(size_t pos, size_t n, size_t n1, char c); //将当前字符串从pos索引开始的n个字符,替换成n1个字符c

3. string& replace(iterator i1, iterator i2, const char* s);//将当前字符串[i1,i2)区间中的字符串替换为字符串s
4. 
void test7()
{
    string s1("hello,world!");

    cout<<s1.size()<<endl;                     // 结果:12
    s1.replace(s1.size()-1,1,1,'.');           // 结果:hello,world.

    // 这里的6表示下标  5表示长度
    s1.replace(6,5,"girl");                    // 结果:hello,girl.
    // s1.begin(),s1.begin()+5 是左闭右开区间
    s1.replace(s1.begin(),s1.begin()+5,"boy"); // 结果:boy,girl.
    cout<<s1<<endl;
}

九.string里的查找find

void test8()
{
    string s("dog bird chicken bird cat");
     string s("wlx is a pigdog")

    //字符串查找-----找到后返回首字母在字符串中的下标

    // 1. 查找一个字符串
    cout << s.find("is") << endl;        // 结果是:4

    // 2. 从下标为6开始找字符'i',返回找到的第一个i的下标
    cout << s.find('i',6) << endl;            // 结果是:10

    // 3. 从字符串的末尾开始查找字符串,返回的还是首字母在字符串中的下标
    cout << s.rfind("is") << endl;       // 结果是:4

    // 4. 从字符串的末尾开始查找字符
    cout << s.rfind('i') << endl;             // 结果是:10 因为是从末尾开始查找,所以返回第一次找到的字符

    // 5. 在该字符串中查找第一个属于字符串s的字符
    cout << s.find_first_of("abc") << endl;  // 结果是:7   即a

    // 6. 在该字符串中查找第一个不属于字符串s的字符------先匹配dog,然后bird匹配不到,所以打印4
    cout << s.find_first_not_of("wlx shi pig") << endl; // 结果是:7

}

十.sort排序
见我另一篇

另:vetor、queue博客里也有,需要自行浏览

sort排序总结+详细

sort排序总结+详细

C++中vector和set都是非常方便的容器,

sort方法是algorithm头文件里的一个标准函数,能进行高效的排序,默认是按元素从小到大排序

将sort方法用到vector和set中能实现多种符合自己需求的排序

首先sort方法可以对静态的数组进行排序

#include<iostream>
using namespace std;
int main(){
    int a[10] = { 9, 0, 1, 2, 3, 7, 4, 5, 100, 10 };
    sort(a, a +10);
    for (int i = 0; i < 10; i++)
        cout << a[i] << endl;
    return 0;
}

在这里插入图片描述
这里可以看到是sort(a,a+10),但是数组a一共只有9个元素,为什么是a+10而不是a+9呢?

因为sort方法实际上最后一位地址对应的数是不取的,

而且vector,set,map这些容器的end()取出来的值实际上并不是最后一个值,而end的前一个才是最后一个值!

需要用prev(xxx.end()),才能取出容器中最后一个元素。

对vector使用sort函数:

第一种情形:基本类型,如vector,vector,vector也是可以的

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main(){
    vector<int> a;
    int n = 5;
    while (n--){
        int score;
        cin >> score;
        a.push_back(score);
    }
    //cout <<" a.end()"<< *a.end() << endl;       执行这句话会报错!
    cout << " prev(a.end)" << *prev(a.end()) << endl;
    sort(a.begin(), a.end());
    for (vector<int>::iterator it = a.begin(); it != a.end(); it++){
        cout << *it << endl;
    }
    return 0;
}

在这里插入图片描述
看到了吗,实际上end的前一个指针指向的元素才是插入时的最后一个值!

排序后从小大大。

第二种情形:用自定义的结构体进行sort算法,

这时候需要自己定义个比较函数,因为sort算法是基于容器中的元素是可以两两比较的,然后从小到大排序,所以要自定义怎么样才是小于(’<’)

#include<iostream>
#include<vector>
#include<set>
#include<string>
#include<algorithm>
using namespace std;
struct student{
    char name[10];
    int score;
};
//自定义“小于”
bool comp(const student &a, const student &b){
    return a.score < b.score;
}
int main(){
    vector<student> vectorStudents;
    int n = 5;
    while (n--){
        student oneStudent;
        string name;
        int score;
        cin >> name >> score;
        strcpy(oneStudent.name, name.c_str());
        oneStudent.score = score;
        vectorStudents.push_back(oneStudent);
    }
    cout << "===========排序前================" << endl;
    for (vector<student>::iterator it = vectorStudents.begin(); it != vectorStudents.end(); it++){
        cout << "name: " << it->name << " score: " << it->score << endl;
    }
    sort(vectorStudents.begin(),vectorStudents.end(),comp);
    cout << "===========排序后================" << endl;
    for (vector<student>::iterator it = vectorStudents.begin(); it != vectorStudents.end(); it++){
        cout << "name: " << it->name << " score: " << it->score << endl;
    }
    return 0;
}

在这里插入图片描述
不过有时候一个排序条件不够,比如要求学生按分数从高到低排序,如果分数相同,则按照年龄从大到小排序

就需要在comp自定义函数里面修改一下判断了,原来是直接return a.score < b.score

现在就需要判断

if (a.score > b.score)
return true;
else if (a.score == b.score && a.age > b.age)
return true;
else
return false;

这里一定要记得else return false!!!有一次比赛的时候写到这个函数,有三个判断条件,结果忘了这茬,总是报错,
到后来有点着急了就自己手动实现了一下写了三个比较函数,调用了三次sort函数!!!!!

#include<iostream>
#include<vector>
#include<set>
#include<string>
#include<algorithm>
using namespace std;
struct student{
    char name[10];
    int score;
    int age;
};
//自定义“小于”
bool comp(const student &a, const student &b){
    if (a.score > b.score)
        return true;
    else if (a.score == b.score  && a.age > b.age)
        return true;
    else                ///这里的else return false非常重要!!!!!
        return false;
}
int main(){
    vector<student> vectorStudents;
    /*set<student> setStudents;*/
    //int n = 5;
    int n = 6;
    while (n--){
        student oneStudent;
        string name;
        int score;
        int age;
        cin >> name >> score>>age;
        strcpy(oneStudent.name, name.c_str());
        oneStudent.score = score;
        oneStudent.age = age;
        vectorStudents.push_back(oneStudent);
    }
    cout << "===========排序前================" << endl;
    for (vector<student>::iterator it = vectorStudents.begin(); it != vectorStudents.end(); it++){
        cout << "name: " << it->name << " score: " << it->score << " age: "<<it->age<<endl;
    }
    sort(vectorStudents.begin(), vectorStudents.end(), comp);
    //sort(setStudents.begin(), setStudents.end());
    cout << "===========排序后================" << endl;
    for (vector<student>::iterator it = vectorStudents.begin(); it != vectorStudents.end(); it++){
        cout << "name: " << it->name << " score: " << it->score << " age: " << it->age << endl;
    }
    return 0;
}

在这里插入图片描述
接下来,对于set做类似的操作。

set是一个集合,内部的元素不会重复,同时它会自动进行排序,也是从小到大

而且set的insert方法没有insert(a,cmp)这种重载,所以如果要把结构体插入set中,我们就要重载’<'运算符。

set方法在插入的时候也是从小到大的,那么我们重载一下<运算符让它从大到小排序

#include<iostream>
#include<vector>
#include<set>
#include<string>
#include<algorithm>
using namespace std;
struct student{
    char name[10];
    int score;
};
//自定义“小于”
bool comp(const student &a, const student &b){
    return a.score < b.score;
}
bool operator < (const student & stu1,const student &stu2){
    return stu1.score > stu2.score;
}
int main(){
    //vector<student> vectorStudents;
    set<student> setStudents;
    //int n = 5;
    int n = 6;
    while (n--){
        student oneStudent;
        string name;
        int score;
        cin >> name >> score;
        strcpy(oneStudent.name, name.c_str());
        oneStudent.score = score;
        setStudents.insert(oneStudent);
    }
    cout << "===========排序前================" << endl;
    for (set<student>::iterator it = setStudents.begin(); it != setStudents.end(); it++){
        cout << "name: " << it->name << " score: " << it->score << endl;
    }
    //sort(setStudents.begin(), setStudents.end(), comp);
    //cout << "===========排序后================" << endl;
    //for (set<student>::iterator it = setStudents.begin(); it != setStudents.end(); it++){
    //    cout << "name: " << it->name << " score: " << it->score << endl;
    //}
    return 0;
}

在这里插入图片描述
我们可以看到,set内元素不会重复,而且它按照它所认为的“从小到大”进行了排序

 

c++源文件 不同后缀(.cc .cpp .C .cp)的区别

参考了C++ Primer Plus第五版中文版 P8

C++实现               源代码的扩展名
UNIX                                C、cc、cxx、c
GNU C++                         C、cc、cxx、cpp、c++
Borland C++                    Cpp
Microsoft Visual C++       cpp、cxx、cc

 

Android系统源码中以cc为后缀

posted @ 2021-01-19 09:38  CharyGao  阅读(2657)  评论(0编辑  收藏  举报