C++ Primer(第五版)学习笔记_5_标准模板库string(2)

C++ Primer(第五版)学习笔记_5_标准模板库string(2)

10、搜索string对象的元素或子串

采用find()方法可查找字符串中的第一个字符元素(char, 用单引号界定)或者子串(用双引号界定);如果查到,则返回下标值(从0开始计数),如果查不到,则返回一个很大的数string:npos(即:4294967295)。

#include <iostream>
#include <stdio.h>
#include <string>

using namespace std;

int main(int argc, char* argv[])
{
    string s;
    s = "cat dog cat";
    //查找第一个字符'c',返回下标值
    cout << s.find('c') << endl;
    //查找第一个子串"c",返回下标值
    cout << s.find("c") << endl;
    //查找第一个子串"cat",返回下标值
    cout << s.find("cat") << endl;
    //查找第一个子串"dog",返回下标值
    cout << s.find("dog") << endl;
    //查找第一个子串"pig",查不到则返回4294967295
    cout << s.find("pig") << endl;
    if(s.find("pig") == string::npos)
        cout << "没有找到" << endl;
    return 0;
}

运行结果:

0

0

0

4

4294967295

没有找到

11、string对象的比较

string对象可以使用compare()方法与其他字符串相比较。如果它比对方大,则返回1;如果它比对方小,则返回-1;如果它与对方相同,则返回0。

#include <iostream>
#include <stdio.h>
#include <string>

using namespace std;

int main(int argc, char* argv[])
{
    string s;
    s = "cat dog cat";
    //使用比较符号">","<","=="
    cout << (s == "cat dog cat") << endl;
    //s比"abc"字符串大,返回1
    cout << s.compare("abc") << endl;
    //异常:s比"cat dog c"字符串大,返回2,发现返回值是剩下2个值不一致则返回2.
    cout << s.compare("cat dog c") << endl;
    //s比"dog"小,返回-1
    cout << s.compare("dog") << endl;
    //s与"cat dog cat"相等,返回0
    cout << s.compare("cat dog cat") << endl;

    return 0;
}

运行结果:

1

1

2

-1

0

12、用reverse反向排序string对象

采用reverse()方法可将string对象迭代器所指向的一段区间中的元素(字符)反向排序。

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

int main(int argc, char* argv[])
{
    string s;
    s = "123456789";
    reverse(s.begin(), s.end());
    cout << s << endl;
    return 0;
}

运行结果:

987654321

13、string对象作为vector元素

string对象可以作为vector向量的元素,这种用法,类似于字符串数组。

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

int main(int argc, char* argv[])
{
    vector<string> str;
    str.push_back("Jack");
    str.push_back("Mike");
    str.push_back("Tom");
    for(int i = 0; i < str.size(); i++)
        cout << str[i] << endl;
    cout << str[0][0] << endl;
    cout << str[1][0] << endl;
    cout << str[2].size() << endl;
    return 0;
}

运行结果:

Jack

Mike

Tom

J

M

3

14、string类型的数字化处理

常常需要将读入的数字的每位分离出来,如果采用取余的方法,花费的时间就会太长,这时,就将读入的数据当成字符串来处理,这样就省时了。

#include <iostream>
#include <string>

using namespace std;

int main(int argc, char* argv[])
{
    string s;
    s = "1234059";
    int sum = 0;
    for(int i = 0; i < s.length(); i++)
    {
        if(s[i] == '0')
            sum += 0;
        else if(s[i] == '1')
            sum += 1;
        else if(s[i] == '2')
            sum += 2;
        else if(s[i] == '3')
            sum += 3;
        else if(s[i] == '4')
            sum += 4;
        else if(s[i] == '5')
            sum += 5;
        else if(s[i] == '6')
            sum += 6;
        else if(s[i] == '7')
            sum += 7;
        else if(s[i] == '8')
            sum += 8;
        else if(s[i] == '9')
            sum += 9;
    }
    cout << sum << endl;
    return 0;
}

运行结果:

24

15、string对象与字符数组互操作

#include <iostream>
#include <stdio.h>
#include <string>

using namespace std;

int main(int argc, char* argv[])
{
    string s;
    char ss[100];
    //输入字符串到字符数组中
    scanf("%s", &ss);
    //字符数组赋值字符串对象
    s = ss;
    //用pringf输出字符串对象,要采用c_str()方法
    printf(s.c_str());
    cout << endl;
    //用printf输出字符数组
    printf("%s", ss);
    cout << endl;
    return 0;
}

运行结果:

abc123

abc123

abc123

16、string对象与sscanf函数

在c语言中,sscanf函数很管用,它可以把一个字符串按你需要的方式分离出子串,甚至是数字。

#include <iostream>
#include <stdio.h>
#include <string>

using namespace std;

int main(int argc, char* argv[])
{
    string s1, s2, s3;
    char sa[100], sb[100], sc[100];
    //将字符串分离成数字,分隔符为空格
    sscanf("abc 123 pc", "%s %s %s", sa, sb, sc);
    s1 = sa;
    s2 = sb;
    s3 = sc;
    cout << s1 << " " << s2 << " " << s3 << endl;
    //将字符串分离成数字,分隔符为空格
    //当用到数字的时候,跟scanf一样,它需要传指针地址
    int a, b, c;
    sscanf("1 2 3", "%d %d %d", &a, &b, &c);
    cout << a << " " << b << " " << c << endl;
    //当字符串分离成数字,分隔符为","和"$"
    //当用到数字的时候,跟scanf一样,它要传指针地址
    int x, y, z;
    sscanf("4,5$6", "%d,%d$%d", &x, &y, &z);
    cout << x << " " << y << " " << z << endl;
    return 0;
}

运行结果:

abc 123 pc

1 2 3

4 5 6

17、string对象与数值相互转换

#include <iostream>
#include <sstream>
#include <string>
#include <stdio.h>

using namespace std;

//将数值转化为string的第二种方法:C++方法
string convertToString(double x)
{
    ostringstream o;
    if(o << x)
        return o.str();
    return "error";
}

double convertFromString(const string &s)
{
    istringstream i(s);
    double x;
    if(i >> x)
        return x;
    return 0.0;
}

int main(int argc, char* argv[])
{
    //将数值转化为string的第一种方法:C方法
    char b[10];
    string a;
    sprintf(b, "%d", 1975);
    a = b;
    cout << a << endl;

    //将数值转化为string的第二种方法:C++方法
    string cc = convertToString(1976);
    cout << cc << endl;

    //将string转化为数值的第一种方法:C++方法
    string dd = "2006";
    int p = convertFromString(dd) + 2;
    cout << p << endl;
    return 0;
}

运行结果:

1975

1976

2008

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-08 13:24:38

C++ Primer(第五版)学习笔记_5_标准模板库string(2)的相关文章

C++ Primer(第五版)学习笔记_4_标准模板库string(1)

C++ Primer(第五版)学习笔记_4_标准模板库string(1) 1.创建string对象 创建一个空字符串,其长度为0 #include <iostream> #include <string> using namespace std; int main(int argc, char* argv[]) { string s; cout << s.length() << endl; return 0; } 运行结果: 0 2.给string对象赋值

C++ Primer(第五版)学习笔记_9_标准模板库_multimap多重映照容器

C++ Primer(第五版)学习笔记_9_标准模板库_multimap多重映照容器 多重映照容器multimap与map结构基本相同,但由于重复键值存在,所以multimap的元素插入.删除.查找都与map的方法不相同. 1.multimap对象创建.元素插入 插入元素时,需要使用insert()方法和类似pair<string,double>("Jack", 300.5)的元素结构.可以看到,重复的元素是按照插入的先后顺序排序的. #include <iostre

C++ Primer(第五版)学习笔记_3_标准模板库vector(2)

C++ Primer(第五版)学习笔记_3_标准模板库vector(2) 欢迎大家阅读参考,如有错误或疑问请留言纠正,谢谢 6.元素的插入 insert()方法可以在vector对象的任意位置前插入一个新的元素,同时,vector自动扩张一个元素空间,插入位置后的所有元素依次向后挪动一个位置. 要注意的是,insert()方法要求插入的位置,是元素的迭代器位置,而不是元素的下标. #include <iostream> #include <vector> using namespa

C++ Primer(第五版)学习笔记_1_标准模板库--快速入门

C++ Primer(第五版)学习笔记_1_标准模板库--快速入门 欢迎大家阅读参考,如有错误或疑问请留言纠正,谢谢 标准模板库(STL)提供三种类型的组件:容器.迭代器和算法,他们都支持泛型程序设计标准. 容器主要有两类:顺序容器和关联容器.顺序容器(vector.list.deque和string等)是一系列元素的有序集合.关联容器(set.multiset.map和multimap)包含查找元素的键值. 迭代器的作用是遍历容器. STL算法库包含四类算法:排序算法.不可变序算法.变序性算法

C++ Primer(第五版)学习笔记_2_标准模板库vector(1)

C++ Primer(第五版)学习笔记_2_标准模板库vector(1) 欢迎大家阅读参考,如有错误或疑问请留言纠正,谢谢 向量容器vector不但能像数组一样进行随机访问,还能在尾部插入元素,完全可以替代数组. 值得注意的是,vector具有内存自动管理的功能,对于元素的插入和删除,可以动态调整所占的内存空间. 容器vector的下标是从0开始的,如果vector容器的大小是n,则元素下标为0~n-1,这和数组的一样的.不一样的是,vector可以随时调整其大小. vector重要的方法有三个

C++ Primer(第五版)学习笔记_6_标准模板库_set集合容器

C++ Primer(第五版)学习笔记_6_标准模板库_set集合容器 Set集合容器实现了红黑树(Red-BlackTree)的平衡二叉检索树的数据结构,在插入元素时,它会自动调整二叉树的排序,把该元素放到适当的位置. (1)确保每个子树根节点的键值大于左子树所有节点的键值,而小于右子树所有节点的键值: (2)另外,还得确保根节点左子树的高度与右子树的高度相等.这样,二叉树的高度最小,从而检索速度最快. 平衡二叉检索树的检索使用中序遍历算法,检索效率高.默认情况下,将键值由小到大遍历. 对于s

C++ Primer(第五版)学习笔记_8_标准模板库_map映照容器

C++ Primer(第五版)学习笔记_8_标准模板库_map映照容器 map映照容器的元素数据是由一个键值和一个映照数据组成的,键值与映照数据之间具有一一映照的关系. map映照容器的数据结构也是采用红黑树来实现的. 1.map创建.元素插入和遍历访问 #include <iostream> #include <stdio.h> #include <vector> #include <map> #include <string> using n

C++ Primer(第五版)学习笔记_7_标准模板库_multiset多重集合容器

C++ Primer(第五版)学习笔记_7_标准模板库_multiset多重集合容器 多重集合容器multiset与set一样,也是使用红黑树来组织元素数据的,唯一不用的是,multiset允许重复的元素键值插入.其结构示意图如下: 1.multiset元素插入 #include <iostream> #include <stdio.h> #include <vector> #include <set> #include <string> usi

C++ Primer 第五版学习笔记

<C++ Primer>第五版中文版学习笔记 ? C++ Primer 第五版学习笔记