编译环境

系统环境:

[email protected]:~$ sudo lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 16.04.6 LTS
Release:	16.04
Codename:	xenial
[email protected]:~$

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;
}

编译运行结果:

[email protected]:~/workspace/others/cpp/demo$ g++ main.cpp -std=c++11
[email protected]:~/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
[email protected]:~/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;
}

编译运行结果:

[email protected]:~/workspace/others/cpp/demo$ g++ main.cpp -std=c++11
[email protected]:~/workspace/others/cpp/demo$ ./a.out 
*hello c++!*
*hello *
**
*ello c++! +++*
*e+*
[email protected]:~/workspace/others/cpp/demo$

致谢

monkeyduckcstring.find()函数用法整理
icrazyc string的erase删除方法