STL-string

9 篇文章 0 订阅

目录

 

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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值