欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

STL-String类

程序员文章站 2022-03-23 14:59:09
...

目录

 

1.使用string类必须包含头文件

2.string的输入赋值与输出

 3.string的常用构造函数

4.字符串获取长度

5. 字符串元素访问

6.字符串比较(按字典序比较,排前的算小的)

7. 字符串修改

8.字符串查找


1.使用string类必须包含头文件<string>

#include<string>

 

2.string的输入赋值与输出

  1. 使用 cin 进行赋值,cout 输出
  2. 使用 getline 进行赋值
  3. 无法直接使用 scanf,printf 进行赋值,输出
#include<string>
#include<iostream>

using namespace std;

int main()
{
    string s;

    getline(cin, s);
    cout << s << '\n';

    cin >> s;
    cout << s << '\n';
    
    return 0;
}

值得注意的是:当 getline 与 cin 同用时(如上),其使用顺序对结果会造成影响,原因是 getline 与 cin 对读入换行符(空白符)的不同的处理方式

若想使用 scanf 对 string 输入赋值:

string a;
a.resize(100);  // 需要预先分配空间
scanf("%s", &a[0]);  // 输入

printf("%s\n",a.c_str());  // 输出

 

 3.string的常用构造函数

  1. string s :生成空字符串
  2. string s(str) :复制字符串 str
  3. string s(str, stridx) :将字符串 str 中始于 stridx 的部分作为构造函数的初值
  4. string s(str, strbegin, strlen) :将字符串 str 中始于strbegin、长度为 strlen 的部分作为字符串初值
  5. string s(num, c) :生成一个字符串,包含 num 个 c 字符
  6. string s(str, beg, end) :以区间 [beg, end] 内的字符作为字符串 s 的初值(begin, end与 第四条不同)
  7. string s(chs) :生成一个与 chs[] 字符数组一样的字符串
  8. string s(chs[, begin], len) :生成一个值为 chs[] 字符数组由 begin (默认值0) 开始的 len 个字符的字符串
#include<string>
#include<iostream>

using namespace std;

int main()
{
    char ch[] = "newString";
    string str ("123456789");
    
    string str1;  // 定义一个空字符串
    string str2(str); // 复制
    string str3(str, 7); // 从位置 7 开始,到结束
    string str4(str, 0, 7);  // 从第 0 个位置开始,复制 7 个字符
    string str5(7,'7');  // 将字符 '7' 重复 7 次
    string str6(str.begin() + 1, str.end() - 1);  // str 去除首尾
    string str7(ch);  // 复制 ch 数组
    string str8(ch, 7);  // ch 的前 7 个元素

    cout << "str1:" << str1 << endl;
    cout << "str2:" << str2 << endl;
    cout << "str3:" << str3 << endl;
    cout << "str4:" << str4 << endl;
    cout << "str5:" << str5 << endl;
    cout << "str6:" << str6 << endl;
    cout << "str7:" << str7 << endl;
    cout << "str8:" << str8 << endl;
    return 0;
}

/*
输出:
str1:
str2:123456789
str3:89
str4:1234567
str5:7777777
str6:2345678
str7:newString
str8:newStri
*/

对于构造函数的第 4 条第 6 条第 8 条需要区分开来。

 

4.字符串获取长度

  1. size() :获取字符串的字符个数
  2. length() :获取字符串的字符个数
  3. capacity() :在当前内存分配中,可容纳的最大字符数(若超过,会继续分配)
  4. max_size() :字符串对象最多可容纳字符数(超过就会报错)
  5. resize(len[, c]) :若 len 小于原字符串长度,相当于截取;反之用字符 c (默认为空格)填充;影响 size、length
  6. reserve(len) :预分配 len 空间给字符串;影响 capacity

注:resize() 也可能影响 capacity,例,其参数大于当前 capacity,会继续分配,导致 

#include<string>
#include<iostream>

using namespace std;

void printSize(string s)
{
    cout << "s: \"" << s << "\"\n";
    cout << "size: " << s.size() << endl;
    cout << "length: " << s.length() << endl;
    cout << "capacity: " << s.capacity() << endl;
    cout << "max_size: " << s.max_size() << endl << endl;
}

int main()
{
    string str ("123456789");
    printSize(str);
    /*
    s: "123456789"
    size: 9
    length: 9
    capacity: 9
    max_size: 1073741820
    */

    str.resize(15);
    printSize(str);
    /*
    s: "123456789      "
    size: 15
    length: 15
    capacity: 15
    max_size: 1073741820
    */

    str.reserve(20);
    printSize(str);
    /*
    s: "123456789      "
    size: 15
    length: 15
    capacity: 20
    max_size: 1073741820
    */

    str.resize(30, 'a');
    printSize(str);
    /*    
    s: "123456789      aaaaaaaaaaaaaaa"
    size: 30
    length: 30
    capacity: 30
    max_size: 1073741820
    */

    return 0;
}

 

5. 字符串元素访问

  1. 使用[ ]下标访问
  2. 使用函数 at()

相同点:在字符串可访问范围内 [0,  length(s) - 1],两种方式一样;

不同点:在访问字符串越界时,使用 [ ] 访问不会报错;使用 at() 会发生错误(即 at 函数会检查下标有效性);

 

6.字符串比较(按字典序比较,排前的算小的)

  1. 使用运算符:==、!=、<、<=、>、>=
  2. 使用函数compare():相等返回 0,小于返回负数,大于返回正数

compare()的几种常见形式:

1. A.compare(B):A 与 B 进行比较

2. A.compare(pos, n, B):A.substr(pos, n) 与 B 进行比较

3. A.compare(pos, n, B, pos2, n2):A.substr(pos, n) 与 B.substr(pos2, n2) 进行比较

#include<string>
#include<iostream>

using namespace std;

int main()
{
    string a("abcDEF123");
    string b("123abcDEF");

    cout << "a.compare(b): " << a.compare(b) << endl;
    cout << "a.compare(6, 3, b): " << a.compare(6, 3, b) << endl;
    cout << "a.compare(3, 3, b, 6, 3): " << a.compare(3, 3, b, 6, 3) << endl;

    return 0;
}
/*
输出:
a.compare(b): 1
a.compare(6, 3, b): -6
a.compare(3, 3, b, 6, 3): 0
*/

 

7. 字符串修改

  1. erase():删除
  2. swap():交换
  3. insert():插入
  4. append():追加(+=)
  5. replace():替换
  6. substr():截取
#include<string>
#include<iostream>

using namespace std;

int main()
{
    string s;
    string a, b;

    // erase(pos[, n]): 从 pos 开始删除 n 个元素, 不指定 n 则删除至末尾
    s = "123456789";
    s.erase(3, 2);
    cout << s << endl;
    s = "123456789";
    s.erase(3);
    cout << s << endl;

    // 交换字符串
    a = "abc";
    b = "123";
    a.swap(b);
    cout << a << '\t' << b << endl;

    // substr(pos[, n]): 从 pos 开始截取 n 个元素, 不指定 n 则截取至末尾
    s = "123456789";
    s = s.substr(3, 5);
    cout << s << endl;
    s = "123456789";
    s = s.substr(3);
    cout << s << endl;

    // 追加字符串
    a = "abc";
    b = "123";
    a.append(b);
    cout << a << '\t' << b << endl;

    // replace(pos, n, str): 用 str 代替原字符串从 pos 开始的 n 个字符
    s = "123456789";
    s = s.replace(3, 5, "abc");
    cout << s << endl;

    // insert(pos, str): 将 str 插入原字符串的 pos 位置
    s = "123456789";
    s = s.insert(7, "abc");
    cout << s << endl;

    return 0;
}

以上例子仅为较常用的例子,部分方法还有其他的重载方法

 

8.字符串查找

  1. find(str[, n]):从左开始,查找第一次出现的位置,没找到返回 npos/-1(实际上 npos != -1,但是 npos == unsigned(-1))
  2. rfind(str[, n]):从右开始,查找第一次出现的位置
  3. find_first_of(str[, n]):查找第一次出现的位置
  4. find_last_of(str[, n]):查找最后一次出现的位置
  5. find_first_not_of(str[, n]):查找第一个不是指定字符/字符串的位置
  6. find_last_not_of(str[, n]):查找最后一个不是指定字符/字符串的位置

以上的 str 可以是字符串,也可以是字符,若指定了 n 则从位置 n 开始查找

#include<string>
#include<iostream>

using namespace std;

int main()
{
    string s = "0123456789876543210";
    if (s.find('g') == -1)
        cout << "unsigned(-1): " << unsigned(-1) << endl;
    cout << "s: " << s << endl;
    cout << "s.find('a'): " << s.find('a') << endl;
    cout << "s.npos: " << s.npos << endl;
    cout << "s.find(\"56\"): " << s.find("56") << endl;
    cout << "s.rfind(\"3\"): " << s.rfind("3") << endl;
    cout << "s.find('3', 5): " << s.find('3', 5) << endl;

    cout << "s.find_first_of('3'): " << s.find_first_of('3') << endl;
    cout << "s.find_last_of('3'): " << s.find_last_of('3') << endl;

    cout << "s.find_first_not_of('3'): " << s.find_first_not_of('3') << endl;
    cout << "s.find_last_not_of('3'): " << s.find_last_not_of('3') << endl;

    return 0;
}

 

 

 

更多和更加详细的内容请参考下面的网站!!

感谢参考网站:http://c.biancheng.net/stl/string/

相关标签: STL C/C++ stl