编译环境
系统环境:
patten@patten-hp:~$ sudo lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 16.04.6 LTS
Release: 16.04
Codename: xenial
patten@patten-hp:~$
IDE环境:Visual Studio Code,Version: 1.36.1
find族成员及其一般用法
string
成员函数中的find
族是用来在给定字符串中定位某个或某组字符的,如下表所示:
字符串查找成员函数 | 函数功能及实现 |
---|---|
find() | 在一个字符串中查找指定的单个字符或字符组。如果找到,就返回首次匹配的开始位置;如果没有查找到匹配的内容,则返回npos |
find_first_of() | 在一个字符串中查找,返回值是第一个与指定字符组中任何字符匹配的字符位置;如果没有查找到匹配的内容,则返回npos |
find_last_of() | 在一个字符串中查找,返回值最后一个与指定字符组中任何字符匹配的字符位置;如果没有查找到匹配的内容,则返回npos |
find_first_not_of() | 在一个字符串中查找,返回值是第一个与指定字符组中任何字符都不匹配的字符位置;如果没有查找到匹配的内容,则返回npos |
find_last_not_of() | 在一个字符串中查找,返回下标值最大的与指定字符组中任何字符都不匹配的字符位置;如果没有查找到匹配的内容,则返回npos |
rfind() | 对一个字符串从尾至头查找指定的单个字符或字符组。如果找到,就返回首次匹配的开始位置;如果没有查找到匹配的内容,则返回npos |
代码示例:
find()
的最简单的应用就是在string
对象中查找一个或多个字符。这个重载的find()
函数使用一个参数用来指示要查找的字符(字符串),还有另一可选的参数用来表示从字符串的何处开始查找字串(默认开始的查找位置是0
)把find
放在循环函数体内,可以很容易地从头至尾遍历一个字符串,重复查找字符串中可能出现的与指定字符或字符组匹配的字串。具体示例如下:
// main.cpp
#include <iostream>
#include <string>
using namespace std;
int main() {
////find函数返回类型 size_type
string s("1a2b3c4d5e6f7g8h9i1a2b3c4d5e6f7g8ha9i");
string flag;
string::size_type position;
// find 函数 返回jk 在s 中的下标位置
position = s.find("jk");
//如果没找到,返回一个特别的标志c++中用npos表示,我这里npos取值是4294967295,
if (position != s.npos) {
cout << "position is : " << position << endl;
} else {
cout << "Not found the flag" + flag << endl;
}
cout << endl;
// find 函数 返回3c4d 在s 中的下标位置
position = s.find("3c4d");
//如果没找到,返回一个特别的标志c++中用npos表示,我这里npos取值是4294967295,
if (position != s.npos) {
cout << "position is : " << position << endl;
} else {
cout << "Not found the flag" + flag << endl;
}
cout << endl;
// find 函数 返回flag 中任意字符 在s 中第一次出现的下标位置
flag = "c";
position = s.find_first_of(flag);
cout << "s.find_first_of(flag) is : " << position << endl << endl;
//从字符串s 下标5开始,查找字符串b ,返回b 在s 中的下标
position = s.find("b", 5);
cout << "s.find(b,5) is : " << position << endl;
cout << endl;
//查找s 中flag 出现的所有位置。
flag = "a";
position = 0;
int i = 1;
while ((position = s.find_first_of(flag, position)) != string::npos) {
// position=s.find_first_of(flag,position);
cout << "position " << i << " : " << position << endl;
position++;
i++;
}
cout << endl;
//查找flag 中与s 第一个不匹配的位置
flag = "acb12389efgxyz789";
position = flag.find_first_not_of(s);
cout << "flag.find_first_not_of (s) :" << position << endl << endl;
//反向查找,flag 在s 中最后出现的位置
flag = "3";
position = s.rfind(flag);
cout << "s.rfind (flag) :" << position << endl;
return 0;
}
编译运行结果:
patten@patten-hp:~/workspace/others/cpp/demo$ g++ main.cpp -std=c++11
patten@patten-hp:~/workspace/others/cpp/demo$ ./a.out
Not found the flag
position is : 4
s.find_first_of(flag) is : 5
s.find(b,5) is : 21
position 1 : 1
position 2 : 19
position 3 : 34
flag.find_first_not_of (s) :11
s.rfind (flag) :22
patten@patten-hp:~/workspace/others/cpp/demo$
从字符串中删除字符
函数原型
basic_string & erase(size_type pos=0, size_type n=npos); //即从给定起始位置pos处开始删除, 要删除字符的长度为n, 返回值修改后的string对象引用
iterator erase(const_iterator position) //删除迭代器位置处的单个字符, 并返回下个元素的迭代器
iterator erase(const_iterator first, const_iterator last) //删除迭代器[first, last)区间的所有字符,返回一个指向被删除的最后一个元素的下一个字符的迭代器.
函数功能
使用erase()
成员函数删除字符串中的字符是简单有效的。这个函数有两个参数:一个参数pos
表示开始删除字符的位置(默认值是0
);另一个参数npos
表示要删除多少字符(默认值是string::npos
)。如果指定删除的字符个数比字符串中剩余的字符串还多,那么剩余的字符将全部被删除(所以调用不含参数的erase()
函数将删除字符串中的所有字符)。
代码示例
#include <iostream>
#include <string>
#include<vector>
using namespace std;
int main() {
string str = "hello c++! +++";
// 从位置pos=10处开始删除,直到结尾
// 即: " +++"
str.erase(10);
cout << '*' << str << '*' << endl;
// 从位置pos=6处开始,删除4个字符
// 即: "c++!"
str.erase(6, 4);
cout << '*' << str << '*' << endl;
// 从位置pos=0处开始,删除10个字符
//指定删除的字符个数比字符串中剩余的字符串还多
// 即: "hello "
str.erase(0, 10);
cout << '*' << str << '*' << endl;
str = "hello c++! +++";
//删除指定迭代器pos=str.begin()的单个字符
//即 “h”
string::iterator pos = str.begin();
str.erase(pos);
cout << '*' << str << '*' << endl;
//删除指定迭代器[first, last] 的单个字符
//即 “llo c++! ++”
string::iterator first = ++str.begin();
string::iterator last = --str.end();
str.erase(first, last);
cout << '*' << str << '*' << endl;
return 0;
}
编译运行结果:
patten@patten-hp:~/workspace/others/cpp/demo$ g++ main.cpp -std=c++11
patten@patten-hp:~/workspace/others/cpp/demo$ ./a.out
*hello c++!*
*hello *
**
*ello c++! +++*
*e+*
patten@patten-hp:~/workspace/others/cpp/demo$