笔记会持续更新,有错误的地方欢迎指正,谢谢!
额外的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,它有属性姓名,年龄,学历等,我们就可以 以其中任意一个属性为优先级来排序。
迭代器失效
添加或删除元素可能使指向容器元素的指针、引用、迭代器失效。