C++ primer 第九章复习 - 2

简介: C++ primer 第九章复习 - 2

C++ primer 第九章

9.5 额外的string操作

构造 string 的其它方法


const char* cp="Hello World!"; //以空字符结束的数组
char noNull[] = { 'H', 'I' }; //不是以空字符结束
std::string s1(cp); //拷贝cp中的字符直至遇到空字符,等同于s1="Hello World!"std::string s2(noNull,2); //从noNull拷贝两个字符: s2 ="HI"std::string s3(noNull); //拷贝noNull中的字符直至遇到空字符
std::string s4(cp+6,5); //从cp[6]开始拷贝5个字符: s4 ="World"std::string s5(s1, 6, 5); //从s1[6]开始拷贝5个字符直到s1末尾: s5 ="World"std::string s6(s1, 6); //从s1[6]开始拷贝6个字符直到s1末尾: s5 ="World!"std::string s6(s1, 6, 20); //正确,只拷贝到末尾
std::string s6(s1, 20); //数组角标越界

std::string s("Hello World");
std::string str1 = s.substr(0, 5); //Hello 
std::string str2 = s.substr(6); //World
std::string str3 = s.substr(6, 11); //World
std::string str4 = s.substr(12); //数组角标越界

改变 string 的其它方法


std::string s("Hello World");
//除了接受迭代器版本的insert和erase,string 还提供了接受下标的版本
s.insert(s.size(), 5, '!'); //在s末尾插入5个感叹号
s.erase(s.size() -5, 5); //删除s最后5个字符
//还提供接受C风格字符数组的inset和assign版本
const char* cp1 ="Stately plump Buck";
s.assign(cp1, 7); //s = Stately
std::cout << s << std::endl;
s.insert(s.size(), cp1 +7); //s = Stately plump Buck
std::cout << s << std::endl;
//指定来自其它的字符串的字符插入到当前string
std::string st1 ="some string", st2 ="some other string";
st1.insert(0, st2); //在 st1 中位置0之前插入 st2
std::cout << st1 << std::endl;
st1.insert(0, st2, 0, st2.size()); //在st1[0]之前插入st2中st2[0]开始的st2.size()个字符
std::cout << st1 << std::endl;


//append操作是在string末尾进行插入操作的一种简写形式
std::string s1("C++ Primer"), s2 = s1;
s1.insert(s1.size(), "4th Ed"); //s1 = C++ Primer 4th Ed
s2.append("4th Ed"); //s2 = C++ Primer 4th Ed
//replace操作是调用erase和insert操作的一种简写
//将 4th 替换为 5th 的等价方法
s1.erase(11, 3); // s1 = C++ Primer Ed
s1.insert(11, "5th"); // s1 = C++ Primer 5th Ed
//从位置11开始,删除三个字符插入"5th"s2.replace(11, 3, "5th");

string 的搜索操作

string提供了六个不同的搜索函数



每个函数都有四个不同的重载



//每个搜索操作都返回一个 string::size_type 类型
std::string name("AnnaBelle");
auto pos1 = name.find("Anna"); //pos1 =0std::string numbers("0123456789"), name1("r2d2");
//返回1,即name第一个数字的下标
auto pos2 = name1.find_first_of(numbers);
std::string dept("03714p3");
//返回5--字符'p'的下标
auto pos3 = dept.find_first_not_of(numbers);
std::string::size_type pos =0; //开始查找的位置
//每步循环查找name中下一个数
while ((pos = name1.find_first_of(numbers,pos)) != std::string::npos){
  std::cout << "found number at index:" << pos << " element is " << name[pos] << std::endl;
++pos; //移动至下一个字符
}
std::string river("Missisippi");
auto first_pos = river.find("is"); //返回1
auto last_pos = river.rfind("is"); //返回4,反向查找

compare 操作


数值转换


int i =42;
std::string s1 = std::to_string(i); //将整数i转换为字符表示
double d = std::stod(s1); //将字符串s转换为浮点数
std::string s2 ="pi = 3.14";
//stod遇到不是数值的字符停止
d = std::stod(s2.substr(s2.find_first_of("+-.0123456789")));

9.6 容器适配器

所有适配器都要求容器具有添加,删除和访问尾元素的能力









//fill up stack
for (size_t ix =0; ix !=10; ++ix){
  intStack.push(ix);
}
while (!intStack.empty()){
  int val = intStack.top();
  std::cout << val << std::endl;
  intStack.pop();
}


默认情况下,栈和队列(非优先级队列)是基于 deque(双向队列,首尾均为插入),priority_queue 是基于vector实现的。可创建设配器,通过第二个参数来指定容器类型


std::stack<int,std::vector<int>> intStack;


相关文章
|
5月前
|
编译器 C++
c++primer plus 6 读书笔记 第十章 对象和类
c++primer plus 6 读书笔记 第十章 对象和类
|
5月前
|
编译器 数据安全/隐私保护 C++
c++primer plus 6 读书笔记 第十三章 类继承
c++primer plus 6 读书笔记 第十三章 类继承
|
5月前
|
C++
C++ Primer Plus (第6版)中文版 (使用XMind整理)
C++ Primer Plus (第6版)中文版 (使用XMind整理)
C++ Primer Plus (第6版)中文版 (使用XMind整理)
|
5月前
|
C++
c++primer plus 6 读书笔记 第十四章 C++中的代码重用
c++primer plus 6 读书笔记 第十四章 C++中的代码重用
|
5月前
|
C++
c++primer plus 6 读书笔记 第十一章 使用类
c++primer plus 6 读书笔记 第十一章 使用类
|
5月前
|
编译器 C++
c++primer plus 6 读书笔记 第八章 函数探幽0
c++primer plus 6 读书笔记 第八章 函数探幽0
|
5月前
|
编译器 vr&ar C++
c++primer plus 6 读书笔记 第七章 函数--C++的编程模块
c++primer plus 6 读书笔记 第七章 函数--C++的编程模块
|
5月前
|
SQL 人工智能 算法
技术心得记录:模板函数函数模板FunctionTemplate(C++Primer
技术心得记录:模板函数函数模板FunctionTemplate(C++Primer
|
5月前
|
程序员 C++
c++primer plus 6 读书笔记 第十二章 类和动态内存分配
c++primer plus 6 读书笔记 第十二章 类和动态内存分配
|
5月前
|
存储 IDE 编译器
c++primer plus 6 读书笔记 第九章 内存模型和名称空间
c++primer plus 6 读书笔记 第九章 内存模型和名称空间