P191~197
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> vi;//定义一个vector vector<typename> name
vector<vector<int> > vo;//vector型vector vector<vector<int> > > >之间有空格 横向延伸纵向也延伸
vector<int> vt[100];//vector型二维数组 横向确定纵向延伸
//通过下标访问 例如vi[n]
//通过迭代器访问 vector<typename>::iterator it;
//push_back(x) 在末尾添加一个元素x
for(int i = 1; i <= 5; i++){
vi.push_back(i);
}// 1 2 3 4 5
//pop_back() 删除尾元素
vi.pop_back();//删除尾元素 5
//vi.size() 获得vector中元素个数
printf("%d\n",vi.size());//输出 4
//clear()
vi.clear();
//begin() 返回首地址
vector<int>::iterator it = vi.begin();
for(int i = 0; i <= 5; i++){
vi.push_back(i);
}//0 1 2 3 4 5
for(int i = 0; i < vi.size(); i++){
printf("%d ",*(it + i));
}
printf("\n");
//insert(it , x)在任意迭代器it处插入一个元素x
vi.insert(it + 3, 10);
for(int i = 0; i < vi.size(); i++){
printf("%d ",*(it + i));
}//0 1 2 10 3 4 5
//erase(it) 删除迭代器为it处的元素
vi.erase(it + 3);
printf("\n");
for(int i = 0; i < vi.size(); i++){
printf("%d ",*(it + i));
}//0 1 2 3 4 5
//erase(frist, end) 删除[frist, end)的元素
vi.erase(it + 1, it + 3);
printf("\n");
for(int i = 0; i < vi.size(); i++){
printf("%d ",*(it + i));
}//0 3 4 5
return 0;
}
P198~201
#include<iostream>
#include<set>// set函数头
using namespace std;
int main(){
//单独定义一个set set<typename> name
set<int> st;
// 定义set数组 set<typename> Arrayname[arraySize]
set<int> a[100];
//只能通过迭代器访问 set<sypename>::iterator it;
//insert() insert(x)可将x插入set容器中,并且自动增排序和去重
st.insert(3);
st.insert(5);
st.insert(2);
st.insert(3);
for(set<int>::iterator it = st.begin(); it != st.end(); it++){
printf("%d ", *it);
}
printf("\n");
//输入了 3 5 2 3 去重排序后应为 2 3 5
//find() find(value)返回对应值为value的迭代器
set<int>::iterator it = st.find(3);
printf("%d\n", *it);
//erase() erase(it) it为所需删除元素的迭代器
st.erase(it);
for(set<int>::iterator it = st.begin(); it != st.end(); it++){
printf("%d ", *it);
}
printf("\n");
//此时序列为 2 3 5 it为3的迭代器 删除后应该为 2 5
//erase() erase(value) value为所需删除元素的值
st.erase(2);
for(set<int>::iterator it = st.begin(); it != st.end(); it++){
printf("%d ", *it);
}
printf("\n");
//此时序列为 2 5 删除2后应该为5
st.insert(3);
st.insert(7);
st.insert(6);
st.insert(2);
for(set<int>::iterator it = st.begin(); it != st.end(); it++){
printf("%d ", *it);
}
printf("\n");
it = st.find(5);
//erase(frist,last) 即删除迭代器地址为[frist,last)的元素
st.erase(it, st.end());
for(set<int>::iterator it = st.begin(); it != st.end(); it++){
printf("%d ", *it);
}
printf("\n");
//重新插入后序列为 2 3 5 6 7 it指向5的地址 删除后序列为2 3
// size() 用来获得set内元素的个数
int num = st.size();
printf("%d\n", num);
//此时set内有元素 2 3 个数应该为2
// clear() 用来清空set内所以的元素
st.clear();
num = st.size();
printf("%d\n", num);
//此时set内元素被清空 个数应该为0
return 0;
}
P202~209
#include<iostream>
#include<string>// string函数头文件
using namespace std;
int main(){
// string name定义 或者string name = "xxxx" 直接初始化
//可以和数组一样通过下标访问
//读入和输出整个字符串 只能用cin 和 cout
//输出时可以用c_str()将string类型转化为字符数组输出
string str = "abcd";
cout<<str<<endl;
printf("%s\n", str.c_str());
//通过迭代器访问
for(string::iterator it = str.begin(); it != str.end(); it++){
printf("%c", *it);
}
printf("\n");
//string和vector一样 支持迭代器+ - 某个数字
// string的加法
string str1 = "efg";
str += str1;
cout<<str<<endl;
//两个string类型可以直接比较大小 比较规则是字典序
string str2 = "eff";
if(str1 > str2){
printf("efg>eff\n");
}
//length() 或者 size()返回string的长度
printf("%d %d\n", str.length(), str.size());
//insert(pos, string) 把string类型的所有元素全部插入到pos位
str.insert(3, str1);
cout<<str<<endl;
// str: abcdefg str1: efg 将str1插入到str的3号位即 c d 中间 输出abcefgdefg
//insert(it, it1, it2) it为原字符串欲插入的位置 it1 it2 为待插入字符串的首位迭代器
str = "abc";
str1 = "xyz";
str.insert(str.begin() + 2, str1.begin(), str1.end());
cout<<str<<endl;
//即将xyz插入到b c 之间
//erase(it) it 为所要删除元素的迭代器
str.erase(str.end() - 1);
cout<<str<<endl;
//删除了str的尾元素
//erase(frist, last) frist last 都为迭代器 即删除地址为[frist, last) 的所有元素
str.erase(str.begin() + 2, str.begin() + 4);
cout<<str<<endl;
//初始str: abxyz 上述操作删除了x y 注意z并没有被删除 输出 abz
//erase(pos, length) 删除pos位后的length个字符
str.erase(1, 2);
cout<<str<<endl;
//初始str: abz 上述操作删除了第1位a后面长度为2的字符 输出 a
//clear() 清空所以字符
str.clear();
printf("%d\n", str.length());
//substr(pos, length) 返回从pos为开始长度为length的字符串 只返回最近的那个
str = "Thank you for your smile";
cout<<str.substr(0, 5)<<endl;
cout<<str.substr(14, 4)<<endl;
cout<<str.substr(19, 5)<<endl;
//string::npos 是一个常数 用以作为find函数失配时的返回值 可以认为值为-1或者4294967295
if(string::npos == -1){
printf("-1 is true.\n");
}
if(string::npos == 4294967295){
printf("4294967295 is also true.\n");
}
//根据编译器不同string::npos == 4294967295可能结果不同
//find(str1) 当str1是str的子串时 返回其在str中第一次出现的位置;如果str2不是str的子串 返回string::npos
//find(str1, pos) 从str的pos位开始寻找
str = "Thank you for your smile";
str1 = "you";
str2 = "me";
if(str.find(str1) != string::npos){
cout<<str.find(str1)<<endl;
}//此时找到的是第一个you
if(str.find(str1, 7) != string::npos){
cout<<str.find(str1, 7)<<endl;
}//此时找到的是your中的you
if(str.find(str2) != string::npos){
cout<<str.find(str2)<<endl;
}else{
cout<<"I know there is no position for me."<<endl;
}
//replace(pos, len, str2) 把str从pos位开始 长度为len的子串替换为str2
//replace(it1, it2, str2) 把str的迭代器[it1, it2)范围内的子串替换为str2
str = "Maybe you will turn around.";
str1 = "will not";
str2 = "surely";
cout<<str<<endl;
cout<<str.replace(10, 4, str1)<<endl;
cout<<str.replace(str.begin(), str.begin() + 5, str2)<<endl;
return 0;
}
P211~212
#include<iostream>
#include<string>
using namespace std;
int n;
string deal(string s, int& e){
int k = 0;
while(s.length() > 0 && s[0] == '0'){
s.erase(s.begin());
}
if(s[0] == '.'){
s.erase(s.begin());
while(s.length() > 0 && s[0] == '0'){
s.erase(s.begin());
e--;
}
}else{
while(k < s.length() && s[k] != '.'){
k++;
e++;
}
if(k < s.length()){
s.erase(s.begin() + k);
}
}
if(s.length() == 0){
e = 0;
}
int num = 0;
k = 0;
string res;
while(num < n){
if(k < s.length()){
res += s[k++];
}else{
res += '0';
}
num++;
}
return res;
}
int main(){
string s1, s2, s3, s4;
cin >> n >> s1 >> s2;
int e1 = 0, e2 = 0;
s3 = deal(s1, e1);
s4 = deal(s2, e2);
if(s3 == s4 && e1 == e2){
printf("YES 0.%s*10^%d\n", s3.c_str(), e1);
}else{
printf("NO 0.%s*10^%d 0.%s*10^%d\n", s3.c_str(), e1, s4.c_str(), e2);
}
return 0;
}
P213~217
#include<iostream>
#include<map>//map函数头文件
using namespace std;
int main(){
//map<typename1, typename2> mp; typename1 与 typename2 分别为键key与值value的类型
map<char, int> mp;
//通过下标访问 map中键是唯一的!
mp['c'] = 20;
mp['c'] = 30;
printf("%d\n", mp['c']);//输出30而不是20
//通过迭代器访问
mp['a'] = 20;
mp['b'] = 10;
for(map<char, int>::iterator it = mp.begin(); it != mp.end(); it++){
printf("%c %d\n", it-> first, it -> second);
}//由输出可知map会以键从小到大的顺序自动排序
//find(key) 返回键为key的映射的迭代器
map<char, int>::iterator it = mp.find('b');
printf("%c %d\n", it-> first, it -> second);
//erase(it) 删除迭代器为it的元素
mp.erase(it);//此时it为'b'的迭代器
for(map<char, int>::iterator it = mp.begin(); it != mp.end(); it++){
printf("%c %d\n", it-> first, it -> second);
}
//erase(key) key为欲删除的映射的键
mp.erase('a');
for(map<char, int>::iterator it = mp.begin(); it != mp.end(); it++){
printf("%c %d\n", it-> first, it -> second);
}
//erase(first, last) 删除迭代器在区间[first, last)的映射
mp['a'] = 20;
mp['b'] = 10;
mp['c'] = 30;
it = mp.find('b');
mp.erase(it, mp.end());
for(map<char, int>::iterator it = mp.begin(); it != mp.end(); it++){
printf("%c %d\n", it-> first, it -> second);
}//只输出a 20
//size() 用来获得map中映射的个数
printf("%d\n", mp.size());
//clear() 清空map中所有映射
mp.clear();
printf("%d\n", mp.size());//此时应该输出0
return 0;
}
P218~220
#include<iostream>
#include<queue>//queue函数头文件
using namespace std;
int main(){
//queue<typename> name; 定义一个queue队列
//push(x) 将x进行入队
//front() back() 分别获得队首和队尾元素
queue<int> q;
for(int i = 1; i <= 5; i++){
q.push(i);
}
printf("%d %d\n", q.front(), q.back());
//pop()令队首元素出队
for(int i = 1; i <=3; i++){
q.pop();
}
printf("%d %d\n", q.front(), q.back());
//empty() 检测queue是否为空 返回true则空 返回false则非空
queue<int> q1;
if(q1.empty() == true){
printf("Empty\n");
}else{
printf("Not empty\n");
}
q1.push(1);
if(q1.empty() == true){
printf("Empty\n");
}else{
printf("Not empty\n");
}
//size() 返回queue内元素的个数
printf("%d\n", q1.size());
return 0;
}
P221~226
#include<iostream>
#include<queue>//priority_queue函数头文件
using namespace std;
struct fruit{
string name;
int price;
}f1, f2, f3;
struct cmp{
bool operator ()(fruit f1, fruit f2){
return f1.price < f2.price;
}
};
int main(){
//priority_queue<typename> name 定义一个优先队列
//push(x) 令x入队
//top() 访问队首元素
//pop() 令队首元素出队
priority_queue<int> q;
for(int i = 1; i <= 3; i++){
q.push(i);
}
printf("%d\n", q.top());
q.pop();
printf("%d\n", q.top());
//empty() 检测队列是否为空
priority_queue<int> q1;
if(q1.empty() == true){
printf("Empty\n");
}else{
printf("Not empty\n");
}
q1.push(1);
if(q1.empty() == true){
printf("Empty\n");
}else{
printf("Not empty\n");
}
//size() 返回优先队列内元素的个数
printf("%d\n", q1.size());
//优先级设置
//priority_queue<typename1, vector<typename2>, cmp> name typename2 与 typename1 数据类型相同 cmp可以用greater<>或者less<>替代
//使用greater<>时最小的优先级最高
priority_queue<int, vector<int>, greater<int> > q_greater;
q_greater.push(1);
q_greater.push(2);
q_greater.push(3);
printf("%d\n", q_greater.top());
//使用less<>时最大的优先级最高
priority_queue<int, vector<int>, less<int> > q_less;
q_less.push(1);
q_less.push(2);
q_less.push(3);
printf("%d\n", q_less.top());
//使用cmp 可见顶部对cmp结构体的定义 同时定义了fruit结构体
priority_queue<fruit, vector<fruit>, cmp> q_fruit;
f1 = {"桃子", 3};
f2 = {"梨子", 4};
f3 = {"苹果", 1};
q_fruit.push(f1);
q_fruit.push(f2);
q_fruit.push(f3);
printf("%s %d\n", q_fruit.top().name.c_str(), q_fruit.top().price);
return 0;
}
P227~229
#include<iostream>
#include<stack>//stack函数头文件
using namespace std;
int main(){
//stack本身是一种后进先出的数据结构 只能通过top()来访问栈顶元素
//stack<typename> name 定义一个栈
//push(x) 将x入栈
//top() 获得栈顶元素
//pop() 弹出栈顶元素
stack<int> st;
for(int i = 1; i <=5; i++){
st.push(i);
}//依次将 1 2 3 4 5入栈
for(int i = 1; i <= 3; i++){
st.pop();
}//依次将 5 4 3 出栈
printf("%d\n", st.top());//此时输出栈顶元素 2
//size() 返回stack内栈的个数
printf("%d\n", st.size());
//empty() 检测stack内是否为空
stack<int> st2;
if(st2.empty() == true){
printf("Empty\n");
}else{
printf("Not empty\n");
}
st2.push(1);
if(st2.empty() == true){
printf("Empty\n");
}else{
printf("Not empty\n");
}
return 0;
}
P230~232
#include<iostream>
#include<map>//#include<utility> 包含于map中
using namespace std;
int main(){
//pair<typename1, typename2> name 定义一个pair
//临时构建一个pair有两种方式
//pair<typename1, typename2>( 对应类型的元素,对应类型的元素)
//make_pair(元素, 元素)
//pair 通过 first second 访问
pair<string, int>p("haha", 5);
printf("%s %d\n", p.first.c_str(), p.second);
p = make_pair("xixi", 55);
printf("%s %d\n", p.first.c_str(), p.second);
p = pair<string, int>("heihei", 555);
printf("%s %d\n", p.first.c_str(), p.second);
//pair可以直接通过< <= 等比较大小 先比较first 再比较second
return 0;
}
P233~244
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
using namespace std;
bool cmp(string a, string b){
//长度从小到大 字典序从大到小排序
if(a.length() != b.length()){
return a.length() < b.length();
}else{
return a > b;
}
}
int main(){
//max(x, y) 返回x y中最大者的值
//min(x, y) 返回x y中最小者的值
//abs(x) 返回x的绝对值
//swap(x, y) 交换 x y 的值
//reverse(it, it2) 可以将数组指针在[it, it2)之间的元素或者容器的迭代器在[it, it2)范围内的元素进行反转
//next_permutation() 给出一个序列在全排列中的下一个序列
int a[3] = {1, 2, 3};
do{
printf("%d %d %d\n", a[0], a[1], a[2]);
}while(next_permutation(a, a + 3));//next_permutation()在已经达到全排列的最后一个时会返回false,方便退出循环
//fill() 可以把数组或者容器中某一段区间赋某个相同的值 和memset不同 这里的赋值可以是数组类型对应范围中的任意值 区间符合左闭右开原则
fill(a, a + 2, 5);
for(int i = 0; i < 3; i++){
printf("%d ", a[i]);
}
printf("\n");
//sort(首元素地址, 尾元素地址的下一个地址, 比较函数(非必须)) 默认从小到大
//比较函数返回值 a > b 则递减 a < b 则递增
//对于结构体需要利用条件语句分级讨论
//在STL标准容器中 只有vector string deque是可以使用sort的 而set map这种容器是用红黑树实现的 本身有序 故不允许使用sort排序
//以vector为例
vector<int> vi;
vi.push_back(1);
vi.push_back(3);
vi.push_back(2);
sort(vi.begin(), vi.end() );//未插入cmp 默认从小到大排序
for(int i = 0; i < 3; i++){
printf("%d ", vi[i]);
}
printf("\n");
//以string为例
string str[3] = {"bbb", "cc", "aaa"};
sort(str, str + 3, cmp);
for(int i = 0; i < 3; i++){
printf("%s\n", str[i].c_str());
}
//lower_bound(first, last, val) 用来寻找数组或者容器的[first, last)范围内第一个值大于等于val的元素的位置 返回该位置的指针或者迭代器
//upper_bound(first, last, val) 用来寻找数组或者容器的[first, last)范围内第一个值大于val的元素的位置 返回该位置的指针或者迭代器
return 0;
}