编程语言
首页 > 编程语言> > C++string类常见接口函数原型与使用

C++string类常见接口函数原型与使用

作者:互联网

string类

一、什么是string类?

在C语言中,我们要定义使用char*来定义和操作字符串,但是一般这种情况下字符串的大小都是固定的,动态重新开辟空间也较为麻烦。更改字符串也不方便,需要自己手动写好多函数接口来实现不同的功能。为了改变这一情况,C++使用了string类来进行字符串操作,所有与字符串相关的函数都封装在string类中,我们只需要调用相关接口进行操作就行了。并且在对字符串添加新的内容时,我们也不用自己去动态开辟新的空间,string类会自动检测,如果空间不够,自己开辟新的空间,并将原空间的内容拷贝到新空间去。

二、类的各个接口

构造函数

在这里插入图片描述

这就是string类的构造函数,我们看到一共有7个构造函数,分别支持各种类型。包括无参构造,指定字符串构造,拷贝构造,迭代器构造等。

#include <iostream>
#include <string>

int main ()
{
  std::string s0 ("Initial string");

  // constructors used in the same order as described above:
  std::string s1;
  std::string s2 (s0);
  std::string s3 (s0, 8, 3);
  std::string s4 ("A character sequence");
  std::string s5 ("Another character sequence", 12);
  std::string s6a (10, 'x');
  std::string s6b (10, 42);      // 42 is the ASCII code for '*'
  std::string s7 (s0.begin(), s0.begin()+7);

  std::cout << "s1: " << s1 << "\ns2: " << s2 << "\ns3: " << s3;
  std::cout << "\ns4: " << s4 << "\ns5: " << s5 << "\ns6a: " << s6a;
  std::cout << "\ns6b: " << s6b << "\ns7: " << s7 << '\n';
  return 0;
}

在这里插入图片描述

运算符重载

=运算符重载

在这里插入图片描述
C++定义了三个’='运算符中重载函数来供用户使用,作用和其他内置类型一样,将=右边的内容放到到左边所提供的空间里

#include <iostream>
#include <string>

int main ()
{
  std::string str1, str2, str3;
  str1 = "Test string: ";   // c-string
  str2 = 'x';               // single character
  str3 = str1 + str2;       // string

  std::cout << str3  << '\n';
  return 0;
}

在这里插入图片描述

[]运算符重载

我们在使用C语言是会使用[]运算符来对字符串的某个元素进行解引用,但是C++的string是一个类,而不是普通的字符串,所以为了使用方便C++重载了[]运算符。
在这里插入图片描述
两个重载函数,一个用于const函数调用,一个用于普通函数调用,使用方法与C语言保持一致。

#include <iostream>
#include <string>

int main ()
{
  std::string str ("Test string");
  for (int i=0; i<str.length(); ++i)
  {
    std::cout << str[i];
  }
  return 0;
}

在这里插入图片描述

+=运算符重载

在对字符串进行增加内容时,这个运算符用的是最多的,因为一目了然,用着也符合人的习惯。
在这里插入图片描述
与=运算符一样,有三个重载函数,分别支持string类,字符串与单个字符的操作。

#include <iostream>
#include <string>

int main ()
{
  std::string name ("John");
  std::string family ("Smith");
  name += " K. ";         // c-string
  name += family;         // string
  name += '\n';           // character

  std::cout << name;
  return 0;
}

在这里插入图片描述

+运算符重载

既然都有+=,那肯定就有+运算符重载了。+=会改变左操作数,而+不会。
在这里插入图片描述

#include <iostream>
#include <string>

main ()
{
  std::string firstlevel ("com");
  std::string secondlevel ("cplusplus");
  std::string scheme ("http://");
  std::string hostname;
  std::string url;

  hostname = "www." + secondlevel + '.' + firstlevel;
  url = scheme + hostname;

  std::cout << url << '\n';

  return 0;
}

在这里插入图片描述

>>运算符重载

为了实现对字符串的输入,C++重载了>>运算符
在这里插入图片描述
值的注意的是,该输入与scanf输入一样,不可以接受空格与换行字符。

#include <iostream>
#include <string>

main ()
{
  std::string name;

  std::cout << "Please, enter your name: ";
  std::cin >> name;
  std::cout << "Hello, " << name << "!\n";

  return 0;
}

在这里插入图片描述

<<运算符重载

在这里插入图片描述
重载<<运算符,就可以像输出字符串一样输出string类了。

#include <iostream>
#include <string>

main ()
{
  std::string str = "Hello world!";
  std::cout << str << '\n';
  return 0;
}

迭代器接口

begin()与end()

在这里插入图片描述
在这里插入图片描述
使用迭代器可以遍历字符串,也可以对对字符串进行修改

#include <iostream>
#include <string>

int main ()
{
  std::string str ("Test string");
  for ( std::string::iterator it=str.begin(); it!=str.end(); ++it)
    std::cout << *it;
  std::cout << '\n';

  return 0;
}

在这里插入图片描述

rbegin()与rend()

在这里插入图片描述

在这里插入图片描述

这个是反向迭代器,正向迭代器可以对字符串进行正向遍历,反向字符串就可以对字符串进行反向遍历。

#include <iostream>
#include <string>

int main ()
{
  std::string str ("now step live...");
  for (std::string::reverse_iterator rit=str.rbegin(); rit!=str.rend(); ++rit)
    std::cout << *rit;
  return 0;
}

在这里插入图片描述

增删查改接口

push_back()尾插

对字符串进行尾插操作
在这里插入图片描述

#include <iostream>
#include <fstream>
#include <string>

int main ()
{
  std::string str;
  std::ifstream file ("test.txt",std::ios::in);
  if (file) {
    while (!file.eof()) str.push_back(file.get());
  }
  std::cout << str << '\n';
  return 0;
}

append()追加

在原字符串后面加上字符串或若干字符
在这里插入图片描述

#include <iostream>
#include <string>

int main ()
{
  std::string str;
  std::string str2="Writing ";
  std::string str3="print 10 and then 5 more";

  // used in the same order as described above:
  str.append(str2);                       // "Writing "
  str.append(str3,6,3);                   // "10 "
  str.append("dots are cool",5);          // "dots "
  str.append("here: ");                   // "here: "
  str.append(10u,'.');                    // ".........."
  str.append(str3.begin()+8,str3.end());  // " and then 5 more"
  str.append<int>(5,0x2E);                // "....."

  std::cout << str << '\n';
  return 0;
}

在这里插入图片描述

insert()指定位置添加

在这里插入图片描述
可以看到这里不仅可以通过下标指定位置添加,也可以通过迭代器指定位置;不仅可以添加字符串,也可以添加单个字符,就是push_back()与append()函数的集合。

#include <iostream>
#include <string>

int main ()
{
  std::string str="to be question";
  std::string str2="the ";
  std::string str3="or not to be";
  std::string::iterator it;

  // used in the same order as described above:
  str.insert(6,str2);                 // to be (the )question
  str.insert(6,str3,3,4);             // to be (not )the question
  str.insert(10,"that is cool",8);    // to be not (that is )the question
  str.insert(10,"to be ");            // to be not (to be )that is the question
  str.insert(15,1,':');               // to be not to be(:) that is the question
  it = str.insert(str.begin()+5,','); // to be(,) not to be: that is the question
  str.insert (str.end(),3,'.');       // to be, not to be: that is the question(...)
  str.insert (it+2,str3.begin(),str3.begin()+3); // (or )

  std::cout << str << '\n';
  return 0;
}

在这里插入图片描述

erease()

删除指定位置n个字符
在这里插入图片描述
npos其实就是size_t的最大值,标识如果不传入要删除多少个字符,则删除所有字符
在这里插入图片描述

#include <iostream>
#include <string>

int main ()
{
  std::string str ("This is an example sentence.");
  std::cout << str << '\n';
                                           // "This is an example sentence."
  str.erase (10,8);                        //            ^^^^^^^^
  std::cout << str << '\n';
                                           // "This is an sentence."
  str.erase (str.begin()+9);               //           ^
  std::cout << str << '\n';
                                           // "This is a sentence."
  str.erase (str.begin()+5, str.end()-9);  //       ^^^^^
  std::cout << str << '\n';
                                           // "This sentence."
  return 0;
}

在这里插入图片描述

size()

返回当前字符串的有效字符个数
在这里插入图片描述

#include <iostream>
#include <string>

int main ()
{
  std::string str ("Test string");
  std::cout << "The size of str is " << str.size() << " bytes.\n";
  return 0;
}

在这里插入图片描述

capacity()

返回当前字符串的空间大小,字符串在进行空间开辟时不会只增加要添加字符的个数个空间,而是在原有空间的基础上增加1.5倍或2倍(不同版本不一致)。所以当前字符串的有效字符个数不一定等于总空间大小。
在这里插入图片描述

#include <iostream>
#include <string>

int main ()
{
  std::string str ("Test string");
  std::cout << "size: " << str.size() << "\n";
  std::cout << "length: " << str.length() << "\n";
  std::cout << "capacity: " << str.capacity() << "\n";
  std::cout << "max_size: " << str.max_size() << "\n";
  return 0;
}

在这里插入图片描述

rsize()

重新定义字符串有效字符个数,可指定字符来填充
在这里插入图片描述

#include <iostream>
#include <string>

int main ()
{
  std::string str ("I like to code in C");
  std::cout << str << '\n';

  unsigned sz = str.size();

  str.resize (sz+2,'+');
  std::cout << str << '\n';

  str.resize (14);
  std::cout << str << '\n';
  return 0;
}

在这里插入图片描述

reserve()

指定字符串大小为n,在定义一个新的string对象时,如果我们知道这个对象要用多大空间,就可以使用reserve()函数来开辟空间。从而避免在使用时多次开辟空间而导致效率低下。值得一提的是改函数只可以把空间扩大,而不可以缩小空间。
在这里插入图片描述

#include <iostream>
#include <fstream>
#include <string>

int main ()
{
  std::string str;
  std::ifstream file ("test.txt",std::ios::in|std::ios::ate);
  if (file) {
    std::ifstream::streampos filesize = file.tellg();
    str.reserve(filesize);

    file.seekg(0);
    while (!file.eof())
    {
      str += file.get();
    }
    std::cout << str;
  }
  return 0;
}

find()

在字符串中正向查找指定字符或字符串
在这里插入图片描述
找到则返回对应位置,找不到返回npos

#include <iostream>       // std::cout
#include <string>         // std::string

int main ()
{
  std::string str ("There are two needles in this haystack with needles.");
  std::string str2 ("needle");

  // different member versions of find in the same order as above:
  std::size_t found = str.find(str2);
  if (found!=std::string::npos)
    std::cout << "first 'needle' found at: " << found << '\n';

  found=str.find("needles are small",found+1,6);
  if (found!=std::string::npos)
    std::cout << "second 'needle' found at: " << found << '\n';

  found=str.find("haystack");
  if (found!=std::string::npos)
    std::cout << "'haystack' also found at: " << found << '\n';

  found=str.find('.');
  if (found!=std::string::npos)
    std::cout << "Period found at: " << found << '\n';

  // let's replace the first needle:
  str.replace(str.find(str2),str2.length(),"preposition");
  std::cout << str << '\n';

  return 0;
}

在这里插入图片描述

rfind()

在字符串中逆向查找指定字符或字符串
在这里插入图片描述

#include <iostream>
#include <string>
#include <cstddef>

int main ()
{
  std::string str ("The sixth sick sheik's sixth sheep's sick.");
  std::string key ("sixth");

  std::size_t found = str.rfind(key);
  if (found!=std::string::npos)
    str.replace (found,key.length(),"seventh");

  std::cout << str << '\n';

  return 0;
}

在这里插入图片描述

标签:std,string,C++,运算符,str,字符串,include,接口函数
来源: https://blog.csdn.net/qq_43647942/article/details/115376905