您的位置:首页 > 编程语言 > C语言/C++

《C++ Primer》读书笔记第九章-3-额外的string操作 And 容器适配器

2017-09-19 23:12 281 查看
笔记会持续更新,有错误的地方欢迎指正,谢谢!

额外的string操作

除了顺序容器的共同操作之外,string还有些额外操作,在此介绍。函数贼多,用到的时候再回来查找吧

构造string的其他方法

构造string的其他方法作用
string s(cp, n)s是cp指向的数组中前n个字符的拷贝
string s(s2, pos2)s是string s2从下标pos2开始的字符的拷贝(若pos2>s2.size(),此函数行为未定义)
string s(s2, pos2, len2)s是string s2从下标pos2开始的len2个字符的拷贝(若pos2>s2.size(),函数行为未定义;若len2太大,只拷贝剩余元素)
取子字符串:(substr)

string s("hello world");
string s2 = s.substr(0, 5) //括号是前闭后开=>s2 = "hello"
string s3 = s.substr(6) //s2 = "world"
string s4 = s.substr(6, 11) //s2 = "word",从6开始,最多拷贝到末尾
string s2 = s.substr(12) //抛出一个out_of_range异常


改变string的其他方法

string s1("hello world");
s1.insert(s1.size(), 5, '!'); //s1 = "hello world!!!!!"
s1.eraser(s1.szie()-5, 5); //s1 = "hello world"

string s2("C++ Primer");
s2.append(" 4th Ed."); //s2 = "C++ Primer 4th Ed."


string搜索操作

找到返回下标,没找到返回空。

函数含义
s.find(args)查找s中args第一次出现的位置
s.rfind(args)查找s中args最后一次出现的位置
例子:

string river = "西调西";
auto first = river.find("西"); //返回0
auto last = river.rfind("西"); //返回2


compare函数

compare有很多重载的版本,都是按字典序比较:

string s1("hello");
string s2("Bill");

//区间都是左闭右开
s1.compare(s2); //hello跟Bill比
s1.compare(0, 2, s2); //”hello“的0到1位和”Bill“比,即he和Bill比。
s1.compare(0, 3, s2, 0, 1); //”hello“的0到2位和”Bill“的第0位比,即hel和B比。
s1.compare(0, 2, s2, 2); //he和by比


数值转换

C++11新标准引入了一些函数,可以实现数值数据与string之间的来回转换:

int i = 42;
string s = to_string(i); //s = "42",to_string()挺实用的。
double d = stod(s); //string->double


容器适配器

容器适配器介绍:

除了顺序容器外,标准库还定义了三个顺序容器适配器:stack栈、queue队列、priority_queue优先队列。

到底适配器啥意思呢?适配器就是一种机制,能让某种事物的行为看起来像另一种事物。容器适配器接受一个已有的容器类型,使其行为看起来像一种不同类型。

我的理解:栈、队列、优先队列这些数据结构都是大家比较常用的,C++也不好意思不支持,于是把原来顺序容器的那些再通过适配器转换成这三个数据结构。

stack和queue是基于deque实现的,priority_queue是在vector之上实现的。

栈适配器

栈是先入后出的:

定义:
stack<int> result;


压入元素到栈顶:
result.push(i);


弹出(删除)栈顶元素:
result.pop();


返回栈顶元素:
result.top();


再提一句:虽然stack是基于deque实现的,但不能使用push_back,必须用自己的push,这样看起来就像两个不同的事物,这不就满足了适配器的意思了嘛。。。

队列适配器

queue队列先进先出,功能就是返回头尾、添加、删除、代替等,用的时候就查表呗。

priority_queue

举个例子:我们的优先队列装的元素是一个类person,它有属性姓名,年龄,学历等,我们就可以 以其中任意一个属性为优先级来排序。

迭代器失效

添加或删除元素可能使指向容器元素的指针、引用、迭代器失效。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ c++primer 读书笔记