首页 > 其他分享 >string

string

时间:2024-08-28 16:54:48浏览次数:4  
标签:字符 string var str 字符串 type

string

string 作为类出现,其集成的操作函数足以完成多数情况下的需要。可以使用 "=" 进行赋值,使用 "==" 进行等值比较,使用 "+" 做串联。

要使用 string 类,必须包含头文件 <string>。在 STL 库中,basic_string 有两个预定义类型:包含 char 的 string 类型和包含 wchar 的 wstring 类型。

int main() {
    string stuff;
    // 从屏幕读入输入的字符串
    cin >> stuff;
    // 或者 getline(cin, stuff);
}

成员函数

在定义 string 类对象时,string 类自身可以管理内存,程序员不必关注内存的分配细节。

string 类提供的各种操作函数大致分为八类:构造器和析构器、大小和容量、元素存取、字 符串比较、字符串修改、字符串接合、I/O 操作以及搜索和查找。

函数名称 功能
构造函数 产生或复制字符串
析构函数 销毁字符串
=,assign 赋以新值
swap() 交换两个字符串的内容
+ =,append()push_back() 添加字符
insert () 插入字符
erase() 删除字符
clear() 移除全部字符
resize() 改变字符数量
replace() 替换字符
+ 串联字符串
==,! =,<,<=,>,>=,compare() 比较字符串内容
size()length() 返回字符数量
max_size() 返回字符的最大可能个数
empty() 判断字符串是否为空
capacity() 返回重新分配之前的字符容量
reserve() 保留内存以存储一定数量的字符
[],at() 存取单一字符
>>,getline() 从 stream 中读取某值
<< 将值写入 stream
copy() 将内容复制为一个 C - string
c_str() 将内容以 C - string 形式返回
data() 将内容以字符数组形式返回
substr() 返回子字符串
find() 搜寻某子字符串或字符
begin()end() 提供正向迭代器支持
rbegin()rend() 提供逆向迭代器支持
get_allocator() 返回配置器

构造函数

int main() {
    // 生成空字符串
    string str;
    str = "hello";
    // 生成字符串str的复制品
    string s1(str);
    // 将字符串 str 中始于下标 2 的部分作为构造函数的初值
    string s2(str, 2);
    // 将字符串 str 中始于下标 1、长度为 2 的部分作为字符串初值
    string s3(str, 1, 2);
    // 以 C_string 类型作为字符串s的初值
    string s4("C_string");
    // 以 C_string 类型的前 2 个字符串作为字符串s的初值
    string s5("C_string", 2);
    // 生成一个字符串,包含 6 个 c 字符
    string s6(6, 'c');
    //以区间 [1, 2] 内的字符作为字符串s的初值
    string s7("hello", 1, 2);
    
    // 只包含一个字符
    string s8(1, 'x');
    string s9("x");
    // 错误:string s10('x');
}

C_string 一般被认为是常规的 C++字符串。目前,在 C++ 中确实存在一个从 const char * 到 string 的隐式型别转换,却不存在从 string 对象到 C_string 的自动型别转换。对于 string 类型的字符串,可以通过 c_str() 函数返回该 string 类对象对应的 C_string。

程序员在整个程序中应坚持使用 string 类对象,直到必须将内容转化为 char* 时才将其转换为 C_string。

compare()

类 basic_string 的成员函数 compare() 的原型如下:

int compare(const basic_string &s) const;
int compare(const Ch *p) const;
int compare(size_type pos, size_type n, const basic_string &s) const;
int compare(size_type pos, size_type n, const basic_string &s, size_type pos2, size_type n2) const;
int compare(size_type pos, size_type n, const Ch *p, size_type = npos) const;

如果在使用 compare() 函数时,参数中出现了位置和大小,比较时只能用指定的子串。例如:

s.compare {pos,n, s2);

若参与比较的两个串值相同,则函数返回 0;若字符串 S 按字典顺序要先于 S2,则返回负值;反之,则返回正值。

在使用时比较运算符时,包括 >、<、==、>=、<=、!=,对于参加比较的两个字符串,任一个字符串均不能为 NULL,否则程序会异常退出。

修改

可以通过使用多个函数修改字符串的值。例如 assign(),operator=,erase(),交换(swap),插入(insert)等。另外,还可通过 append() 函数添加字符。

int main() {
    string str1("123456");
    string str2("abcdefghijklmn");
    string str;

    // 赋值全部
    str.assign(str1);
    // 赋值子串
    str.assign(str1, 3, 3);
    // 赋值从位置 2 至末尾的子串
    str.assign(str1, 2, string::npos);
    // 重复 5 个'X'字符
    str.assign(5, 'X');
    //从第 1 个至倒数第 2 个元素,赋值给字符串 str
    auto itB = begin(str1);
    auto itE = end(str1);
    str.assign(itB, (--itE));


    str = str1;
    // 抹除下标 2 到结尾的字符
    str.erase(2);
    // 抹除开头到结尾
    str.erase(str.begin(), str.end());
    // 交换
    str.swap(str2);

    string A("ello");
    string B("H");
    // 字符串插入到下标 1 的位置,B: Hello
    B.insert(1, A);

    B = 'H';
    // 字符串前 3 个插入到下标 1 的位置,B: Habc
    B.insert(1, "abcde ", 3);

    A = "ello";
    B = "H";
    // 字符串A从下标 2 开始的 2 个字符插入到B下标 1 的位置,B: Hlo
    B.insert(1, A, 2, 2);

    B = "H";
    // 下标 1 处插入 5 个 C,B:HCCCCC
    B.insert(1, 5, 'C');

    A = "ello";
    B = "H";
    auto it = B.begin() + 1;
    auto itF = begin(A);
    auto itG = end(A);
    // B: Hello
    B.insert(it, itF, itG);

    A = "ello";
    B = "H";
    // 追加,B: Hello
    B.append(A);

    B = "H";
    // 追加前两个字符,B: H12
    B.append("12345", 2);

    B = "H";
    // 追加下标 2 开始的 3 个字符,B: H345
    B.append("12345", 2, 3);

    B = "H";
    // 追加下标 5 个 a,B: Haaaaa
    B.append(5, 'a');

    A = "ello";
    B = "H";
    // 追加范围,B: Hello
    B.append(A.begin(), A.end());
    cout << "append: " << B << endl;
    return 0;
}

替换

int main() {
    string var("abcdefghijklmn");
    const string dest("1234");
    string dest2("567891234");

    // var: abc1234ghijklmn
    var.replace(3, 3, dest);

    var = "abcdefghijklmn";
    // var: abc234efghijklmn
    var.replace(3, 1, dest.c_str(), 1, 3);

    var = "abcdefghijklmn";
    // var: abcxxxxxefghijklmn
    var.replace(3, 1, 5, 'x');

    string::iterator itA, itB;
    string::iterator itC, itD;
    itA = var.begin();
    itB = var.end();
    var = "abcdefghijklmn";
    // var: 1234
    var.replace(itA, itB, dest);

    itA = var.begin();
    itB = var.end();
    itC = dest2.begin() + 1;
    itD = dest2.end();
    var = "abodefghijklmn";
    // var: 67891234efghijklmn
    var.replace(itA, itB, itC, itD);

    var = "abcdefghijklmn";

    // var: abc1234efghijklmn
    // 这种方式会限定字符串替换的最大长度
    var.replace(3, 1, dest.c_str(), 4);
    return 0;
}

输入输出

"<<" 和 ">>" 提供了 C++ 语言的字符串输入和字符串输出功能。"<<" 可以将字符读入一个流中(例如 ostream);">>" 可以实现将以空格或回车为 "结束符" 的字符序列读入到对应的字符串中,并且开头和结尾的空白字符不包括进字符串中。

int main() {
    string s1, s2;
    // 该函数可将整行的所有字符读到字符串中。
    // 在读取字符时,遇到文件结束符、分界符、回车符时,将终止读入操作,且文件结束符、分界符、回车符在字符串中不会保存;
    // 当已读入的字符数目超过字符串所能容纳的最大字符数时,将会终止读入操作。
    // 第 1 个参数是输入流;第 2 个参数是保存输入内容的字符串
    getline(cin, s1);
    // 第 1 个参数是输入流,第 2 个参数保存输入的字符串,第 3 个参数指定分界符。
    getline(cin, s2, '$');
}

字符串查找

若查找 find() 函数和其他函数没有搜索到期望的字符(或子串),则返回 npos;若搜索成功,则返回搜索到的第 1 个字符或子串的位置。其中,npos 是一个无符号整数值,初始值为 -1。当搜索失败时, npos 表示“没有找到(not found)”或“所有剩佘字符”。

所有查找 find() 函数的返回值均是 size_type 类型,即无符号整数类型。该返回值用于表明字符串中元素的个数或者字符在字符串中的位置。

find()函数和 rfind()

find() 函数的原型主要有以下 4 种:

// find()函数的第1个参数是被搜索的字符、第2个参数是在源串中开始搜索的下标位置
size_type find(value_type _Chr, size_type _Off = 0) const;
// find()函数的第1个参数是被搜索的字符串,第2个参数是在源串中开始搜索的下标位置
size_type find(const value_type *_Ptr, size_type _Off = 0) const;
// 第1个参数是被搜索的字符串,第2个参数是源串中开始搜索的下标,第3个参数是关于第1个参数的字符个数,可能是 _Ptr 的所有字符数,也可能是 _Ptr 的子串宇符个数
size_type find(const value_type *_Ptr, size_type _Off = 0, size_type _Count) const;
// 第1个参数是被搜索的字符串,第2参数是在源串中开始搜索的下标位置
size_type find(const basic_string &_Str, size_type _Off = 0) const;

rfind() 函数的原型和 find() 函数的原型类似,参数情况也类似。只不过 rfind() 函数适用于实现逆向查找。

int main() {
    string str("0123for789abcfor");
    int len = str.length();
    cout << endl << str.find('2', 0);// 2
    cout << endl << str.rfind('c', len - 1);// 12
    cout << endl << str.find("for", 0);// 4
    cout << endl << str.rfind("for", len - 1);// 13
}

find_first_of()函数和 find_last_of()函数

find_first_of() 函数可实现在源串中搜索某字符串的功能,该函数的返回值是被搜索字符串第 1 个字符第 1 次出现的下标(位置)。若查找失败,则返回 npos

find_last_of() 函数同样可实现在源串中搜索某字符串的功能。与 find_first_of() 函数所不同的是,该函数的返回值是被搜索字符串的最后 1 个字符的下标(位置)。若查找失败,则返回 npos

find_first_not_of()函数和 find_last_not_of()函数

find_first_not_of() 函数可实现在源字符串中搜索与指定字符(串)不相等的第 1 个字符;find_last_not_of() 函数可实现在源字符串中搜索与指定字符(串)不相等的最后 1 个字符。这两个函数的参数意义和前面几个函数相同,它们的使用方法和前面几个函数也基本相同。

标签:字符,string,var,str,字符串,type
From: https://www.cnblogs.com/sprinining/p/18385108

相关文章

  • Android开发 - StringBuilder 类处理字符串解析
    StringBuilder是什么StringBuilder是Java中用于处理字符串的一个类。相较于String类,它更高效,尤其是在需要频繁修改字符串内容的场景下String的不可变性String是不可变的,也就是说,一旦创建了一个String对象,它的内容就无法再改变了。例如,执行以下代码时:Stringstr......
  • 【JavaScript】String常用方法
    String的常用方法长度s.length拼接字符串s.concat('内容','可拼接多个'),或者使用+号链接符,返回一个新字符串位置查找字符串方法;返回字符​查找某位置上的字符s.charAt(下标)返回该下标位置上的字符,未找到返回空白​返回某位置上的字符s[下标](只读,不能赋值),不支......
  • 题解:AT_abc354_g [ABC354G] Select Strings
    题目分析题意给定\(n\)个字符串,要求从中选出若干个组成一个集合,且集合中每个字符串都互不包含。求集合中字符串的权值的和的最大值。分析首先很容易想到用KMP判两个串是否存在包含关系。考虑建图,将不能同时存在于一个集合中的串的节点相连。然后发现只需求出这个图的最......
  • 【C++】_string类字符串万字详细解析
     假如没有给你生命,你连失败的机会都没有。你已经得到了最珍贵的,还需要抱怨什么!......
  • char[] 与 string
    关于输入输出char[]能用C风格输入输出,string通常不行,所以使用string通常顺便解绑cin,cout。解绑后的cin,cout不要和getchar快读同时使用。关于函数传参char[]传入函数中不会占用格外内存,也就是默认取地址的,在函数中更改会直接影响原串。string传入函数中是搞一......
  • Java 12 新特性—新增 String API
    作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬学习必须往深处挖,挖的越深,基础越扎实!阶段1、深入多线程阶段2、深入多线程设计模式阶段3、深入juc源码解析阶段4、深入jdk其余源码解析......
  • 第五题:最长回文子串(Longest Palindromic Substring)
    题目描述:给定一个字符串 s,找到 s 中最长的回文子串。示例:输入:s="babad"输出:"bab" 或 "aba"输入:s="cbbd"输出:"bb"要求: 你需要找出 s 中的最长回文子串。解题思路方法1:中心扩展法回文字符串的特点是对称的,因此我们可以从每个字符(或字符间隙)作为中心,向两......
  • python 06-标准库:random、string、webbrowser、email模块
    random、string模块importrandomimportstringprint(random.random())#任意-个float数字print(random.randint(1,10))#1-10之间包括1和18中任意一个整数print(random.choice([1,2,3]))#1,2,3这几个数字里面任意一个print(random.choices([1,2,3],k=2))......
  • 3.1 string(字符串)
    4.1.string(字符串)SET/SETEX/MSET/MSETNXGET/MGETGETSETINCR/DECRDEL1.设置键值set设置的数据没有额外操作时,是不会过期的。setkeyvalue设置键为name值为yuan的数据setnameyuansetnamerain#一个变量可以设置多次注意:redis中的所有数据操作,如果设置的......
  • Java小白一文深入介绍String、StringBuffer、StringBuilder
    String类String对象用于保存字符串,也就是一组字符序列字符串常量对象是用双引号括起的字符序列,例如“Kerwin”字符串的字符使用Unicode字符编码,一个字符(不区分字母还是汉字)占两个字节String类较常用构造方法Strings1=newString();Strings2=newString(Str......