C++Primer笔记(3)

标准库类型string表示可变长的字符序列,使用前先包含string头文件。(哈哈,终于可以逃脱C语言中的str函数系列了。)因为是标准库的一部分,所以string被定义在命名空间std中。所以你懂该怎么做(参见笔记(2))。

在stl_string_fwd.h中找到如下语句:

typedef basic_string<char>    string;

basic_string是一个模板类,在string中有定义。可以看是对char类型的一个封装,未对其进行深挖,所以本次笔记只做为string操作手册使用。

初始化string对象的方式:

string s1;              //默认初始化,s1为空串
string s2(s1);          //s2是s1的副本
string s2 = s1;         //等价于上一行
string s3("test");      //s3是字面值"test"的副本,除了最后的空字符外
string s3 = "test";     //等价于上一行
string s4(n, ‘c‘);      //s4被初始化为n个‘c‘组成的字符串
string s5(cp, n);       //s5是cp指向的字符串数组中前n个字符的拷贝。此数组至少应该包含n个字符
string s6(s5, n);       //s6是s5从下标n开始的字符的拷贝。若s5.size()<n,则构造函数行为未定义
string s6(s5, n, m);    //s6是s5从下标n开始m个字符的拷贝。若s5.size()<n,则构造函数行为未定义。不管m值是多少,构造函数至多拷贝s5.size() - n个字符

string对象上的操作:

os << s            将s写到输入流os当中,返回os
is  >> s           从is中读取字符串赋给s,字符串以空白分隔,返回is
getline(is, s)     从is中读取一行赋给s,返回is
s.empty()          判断s是否为空,为空返回true,否则返回false
s.size()           返回s中字符的个数
s[n]               返回s中第n个字符的引用,位置n从0开始
s1 + s2            返回s1、s2拼接后的内容
s1 = s2            用s2的副本代替s1中内容
s1 == s2         判断s1、s2是否相等
s1 != s2           是否不相等
<,<=,>,>=          利用字符在字典中的顺序进行比较,从首个字符开始向后依次比较,一有结果立刻返回。

插入

s.insert(pos, args);    //在pos之前插入args指定的字符。pos可以是一个下标或者迭代器。接受下标的版本返回一个指向s的引用,接受迭代器的版本返回指向第一个插入字符的迭代器。

删除

s.erase(pos, len);    //删除从位置pos开始的len个字符。如果len被省略,则删除从pos开始直至s末尾的所有字符。返回一个指向s的引用

替换

s.assign(args);    //将s中的字符替换为args指定的字符。返回一个指向s的引用
s.replace(n, m, args);    //删除从下标n开始m个字符或删除迭代器n和m表示的范围中的字符,替换为args指定的字符。

追加

s.append(args);    //将args中的字符追加到s中,返回一个指向s的引用

子字符串操作

s.substr(pos, n);    //返回一个string,包含s中从pos开始的n个字符的拷贝。pos的默认值是0,n的默认值是s.size() - pos,即拷贝从pos开始的所有字符

搜索

s.find(args);                //查找s中args第一次出现的位置
s.rfind(args);               //查找s中args最后一次出现的位置
s.find_first_of(args);       //在s中查找args中任何一个字符第一次出现的位置
s.find_last_of(args);        //在s中查找args中任何一个字符最后一次出现的位置
s.find_first_not_of(args);   //在s中查找第一个不在args中的字符
s.find_last_not_of(args);    //在s中查找最后一个不在args中的字符

比较

s.compare(s1);                         //比较string s和s1
s1.compare(pos1, n1, s2);              //将s1中从pos1开始的n1个字符与s2进行比较
s1.compare(pos1, n1, s2, pos2, n2);    //将s中从pos1开始的n1个字符与s2中从pos2开始的n2个字符串进行比较
s.compare(cp);                         //比较s和cp指向的以空字符结尾的字符串数组
s1.compare(pos1, n1, cp);              //将s1和从pos1开始的n1个字符与cp指向的以空字符结尾的字符串数组比较
s1.compare(pos1, n1, cp, n2);          //将s1和从pos1开始的n1个字符与指针cp指向的地址开始的n2个字符进行比较

string和数值之间的转换

to_string(var);    //返回数值val的string表示。val可以是任意算术类型

/*返回s的起始子串的数值*/
stoi(s, p, b);     //返回int型
stol(s, p, b);     //返回long型
stoul(s, p, b);    //返回unsigned long型
stoll(s, p, b);    //返回long long型
stoull(s, p, b);   //返回unsigned long long型
stof(s, p, b);     //返回float型
stod(s, p, b);     //返回double型
stold(s, p, b);    //返回long double型
/*其中p为size_t类型的指针,用来存放第一个非数值字符的下标,默认为0*/
/*b表示进制,默认为10*/

此处应注意在string转数值时,所提供的string中第一个非空白字符必须是数值中可能出现的字符!

时间: 2024-10-13 16:18:47

C++Primer笔记(3)的相关文章

C++ Primer笔记8_动态内存_智能指针

1.动态内存 C++中,动态内存管理是通过一对运算符完成的:new和delete.C语言中通过malloc与free函数来实现先动态内存的分配与释放.C++中new与delete的实现其实会调用malloc与free. new分配: 分配变量空间: int *a = new int; // 不初始化 int *b = new int(10); //初始化为10 string *str = new string(10, ); 分配数组空间: int *arr = new int[10];//分配的

C++ Primer笔记12_运算符重载_递增递减运算符_成员访问运算符

1.递增递减运算符 C++语言并不要求递增递减运算符必须是类的成员.但是因为他们改变的正好是所操作对象的状态,所以建议设定为成员函数. 对于递增与递减运算符来说,有前置与后置两个版本,因此,我们应该为类定义两个版本的递增与递减运算符. 问题来了,程序是如何区分前置和后置呢?因为都是++和-- 为了解决这个问题,后置版本的递增递减运算符接受一个额外的(不被使用)int类型的形参.当我们使用后置运算符时,编译器为这个形参提供一个值为0的实参.这个形参唯一的作用就是区分前置和后置运算符函数. 因为不会

C++ Primer笔记2_四种类型转换_异常机制

1.类型转换 命名的强制类型转换: 有static_cast.dynamic_cast.const_cast.reinterpret_cast static_cast: 编译器隐式执行的任何类型转换都可以由static_cast完成 当一个较大的算术类型赋值给较小的类型时,可以用static_cast进行强制转换. 可以将void*指针转换为某一类型的指针 可以将基类指针强制转换为派生类指针,但是不安全. 无法将const转化为nonconst,这个只有const_cast才可以办得到 举例:

重读C++ Primer笔记

C++ Primer 5E 有符号和无符号 无符号类型和有符号类型混合运算时,有符号数会被提升至无符号类型,如果其值为负责会产生错误. int main() { unsigned int u = 10; int i = -42; std::cout<<u+i<< std::endl; // 4294967264 if sizeof(int)==4 return 0; } 列表初始化 列表初始化过程不允许损失数据类型精度,所以下面代码中的两行无法通过编译 int main() { d

C++ Primer笔记6_STL之泛型算法

1.泛型算法: 大多数算法定义在头文件algorithm中,标准库还在头文件numeric中定义了一组数值泛型算法 只读算法: 举例: find函数用于找出容器中一个特定的值,有三个参数 int val = 10;//val为我们需要查找的值 auto result = find(vec.begin(), vec.end(), val): cout << "The value "<< val << (result == vec.end() ? &qu

C++ Primer笔记13_运算符重载_总结

总结: 1.不能重载的运算符: . 和 .* 和 ?: 和 ::  和 sizeof 和 typeid 2.重载运算符有两种基本选择: 类的成员函数或者友元函数, 建议规则如下: 运算符 建议使用 所有一元运算符 成员函数 = () [] -> 必须是成员函数 += -= /= *= ^= &= != %= >>= <<= , 似乎带等号的都在这里了. 成员函数 所有其它二元运算符, 例如: –,+,*,/ 友元函数 3.前几篇中的实例,现在汇总Person类的程序:

C++ Primer笔记4_类的静态成员_IO库

1.类的静态成员 static成员变量与函数 static成员变量:必须在类外初始化:(const或引用类型变量必须在构造函数初始化列表里初始化) static成员函数: 不依赖于类,相当于类里的全局函数(可以由该类对象调用,也可以 类名::函数名()的形式调用) 不包含this指针,不能声明为const,声明为const表示不会改变对象,而static成员函数存在于任何对象之外. 相当于把访问范围限制在所在的类中!  注意:不能访问类中非static成员变量以及非static成员函数. 注意:

C++ Primer笔记3_默认实参_类初探_名字查找与类的作用域

1.默认函数实参 在C++中,可以为参数指定默认值,C语言是不支持默认参数的,Java也不支持! 默认参数的语法与使用: (1)在函数声明或定义时,直接对参数赋值.这就是默认参数: (2)在函数调用时,省略部分或全部参数.这时可以用默认参数来代替. 注意事项: (1)函数默认值只能赋值一次,或者是在声明中,或者是在定义中,都可以. (2)默认参数定义的顺序为自右到左.即如果一个参数设定了缺省值时,其右边的参数都要有缺省值.比如int f(int a, int b=1,int c=2,int d=

C++ Primer笔记7_STL之关联容器

关联容器 与顺序容器不同,关联容器的元素是按关键字来访问和保存的.而顺序容器中的元素是按他们在容器中的位置来顺序保存的. 关联容器最常见的是map.set.multimap.multiset map的元素以键-值[key-value]对的形式组织:键用作元素在map中的索引,而值则表示所存储和读取的数据. set仅包含一个键,并有效的支持关于某个键是否存在的查询. pair类型 首先介绍下pair,pair定义在utility头文件中,一个pair保存两个数据成员,类似容器,pair是一个用来生

C++ Primer 笔记 第三章

C++ Primer 第三章 标准库类型 3.1using声明 例: using namespace atd; using std::cin; 3.2string类型 初始化方式 string s1 默认构造函数,s1为空串 string s2(s1) 将s2初始化为s1的一个副本 string s3(“value”) 将s3初始化为一个字符串的副本 string s4(n, 'c') 将s4初始化为字符'c'的n个副本 getline读取整行文本 getline接受两个参数:一个是输入流对象和