我们读过的书,说过的话,见过的山水,见到的人和事,最终都会变成我们脚下的的路。
1.string容器
string 是 C++ 风格的字符串,而 string 本质上是一个类。
#include <iostream>
using namespace std;
#include <string>
//以下参数为const char* 类型与string类型的函数参数可以相互替换
void test01()
{//一、string构造函数string s1;//1.默认构造const char* str1 = "max";string s3(str1);//2.使用字符串进行初始化构造cout << "s3 =" << s3 << endl;string s4(s3);//3.使用一个string对象初始化另一个string对象cout << "s4 =" <<s4 <<endl;string s5(7, 'x');cout << "s5=" <<s5<< endl;//二.赋值方式const char* str2 = "min";s5 = str2;//char*类型字符串 赋值给当前的字符串cout << "s5=" << s5 << endl;s5 = s4;//把字符串s赋给当前的字符串cout << "s5=" << s5 << endl;s5 = 'a';//字符赋值给当前的字符串cout << "s5=" << s5 << endl;s5 = str2;//char*类型字符串 赋值给当前的字符串s5 = "hello,world";cout << "s5=" << s5 << endl;s5.assign(str2);//把字符串s赋给当前的字符串cout << "s5=" << s5 << endl;s5.assign(str2,2);//把字符串s的前n个字符赋给当前的字符串cout << "s5=" << s5 << endl;s5.assign(s4);//把字符串s赋给当前字符串cout << "s5=" << s5 << endl;s5.assign(2, 's');//用n个字符c赋给当前字符串cout << "s5=" << s5 << endl;//三、字符串拼接s5 += "rr";//string& operator+=(const char* str);重载+=操作符cout << "s5=" << s5 << endl;s5 += 'a';//string& operator+=(const char c); //重载+=操作符cout << "s5=" << s5 << endl;s5 += s4;//string& operator+=(const string& str); //重载+=操作符cout << "s5=" << s5 << endl;string str11 = "I LOVE ";str11.append("my country");//string& append(const char *s); //把字符串s连接到当前字符串结尾cout << "str11=" << str11 << endl;str11.append("tooooo",2);//string& append(const char *s, int n); //把字符串s的前n个字符连接到当前字符串结尾cout << "str11=" << str11 << endl;string str12 = "1";str11.append(str12);//string& append(const string &s); //同operator+=(const string& str)cout << "str11=" << str11 << endl;string str13 = "2223333";//string& append(const string &s, int pos, int n); //字符串s中从pos开始的n个字符连接到字符串结尾str11.append(str13,3,3);cout << "str11=" << str11 << endl;//四、查找和替换//find查找是从左往后,rfind从右往左;// find找到字符串后返回查找的第一个字符位置,找不到返回-1;// replace在替换时,要指定从哪个位置起,多少个字符,替换成什么样的字符串string str111="yue shi gu xiang ming";int pos1 = str111.find("ng");//int find(const string& str, int pos = 0) const;查找str第一次出现位置,从pos位置开始查找cout << "pos1=" << pos1 << endl;int pos4 = str111.find("ng",0,1);//int find(const char* s, int pos, int n) const; //从pos位置查找s的前n个字符第一次位置cout << "pos4=" << pos4 << endl;int pos2 = str111.rfind("ng"); //int rfind(const string& str, int pos = npos) const;查找str最后一次位置, 从pos开始查找cout << "pos2=" << pos2 << endl;int pos3 = str111.rfind("ng",21,1); //int rfind(const char* s, int pos, int n) const; //从pos查找s的前n个字符最后一次位置cout << "pos3=" << pos3 << endl;cout << "替换前str111=" << str111 << endl;str111.replace(0,7,"moon is");//替换从pos开始n个字符为字符串strcout << "替换后str111=" << str111 << endl;//五、字符串比较//字符串对比主要是用于比较两个字符串是否相等string str555 = "hello";string str556 = "hello";int pos557=str555.compare(str556);//int compare(const string &s) const;返回值为0,二者相等int pos558 = str555.compare("hello");//int compare(const char *s) const;cout <<"pos557=" << pos557 << endl;cout <<"pos558=" << pos558 << endl;//六、字符串存取//string字符串中单个字符存取有两种方式,利用 [ ] 或 atstring str666 = "hello world";for (int i = 0; i < str666.size(); i++){cout<<"str666=" << str666[i] << " ";}cout << endl;for (int i = 0; i < str666.size(); i++){cout<<"str666" << str666.at(i) << " ";}cout << endl;//字符修改str666[0] = 'x';str666.at(1) = 'x';cout <<"str666" << str666 << endl;//七、字符串插入与删除
// //插入和删除的起始下标都是从0开始string str777 = "hello world";str777.insert(2,"llll"); //string& insert(int pos, const char* s); //插入字符串cout << "str777=" << str777 << endl;str777.insert(8, 3, 'x');//string& insert(int pos, int n, char c); //在指定位置插入n个字符ccout << "str777=" << str777 << endl;str777.erase(8,3);str777.erase(2,4);//string& erase(int pos, int n = npos); //删除从Pos开始的n个字符cout << "str777=" << str777 << endl;//八、string子串
// //从字符串中获取想要的子串string str888 = "hello world";string str889=str888.substr(0, 5); //string substr(int pos = 0, int n = npos) const; //返回由pos开始的n个字符组成的字符串cout << "str889=" << str889 << endl;
}
int main() {test01();
}
2.vector容器
vector数据结构和数组非常相似,也称为单端数组,不同之处在于数组是静态空间,而vector可以动态扩展,动态扩展并不是在原空间之后续接新空间,而是找更大的内存空间,然后将原数据拷贝新空间,释放原空间。
#include <iostream>
using namespace std;
#include <vector>
void printfVector(vector <int> &v)
{for (vector<int>::iterator it = v.begin(); it != v.end(); it++)//iterator(迭代器){cout << *it << " ";}cout << endl;
}void test01() {//一、vector构造方式vector <int> v1;//1.默认构造for (int i = 0; i < 10; i++){v1.push_back(i);//尾插}printfVector(v1);vector<int>v2(v1.begin(), v1.end());//2.区间构造printfVector(v2);vector<int>v3(10, 100);//3.用n个元素的方式构造printfVector(v3);vector<int>v4(v3);//4.拷贝构造printfVector(v4);//二、vector赋值方式v4 = v1;// 1.operator=printfVector(v4);v4.assign(v3.begin(), v3.end());//2.assign方式printfVector(v4);v4.assign(5, 20);//3.n个元素的方式printfVector(v4);//vector容量和大小if (v4.empty())//为真代表容器为空{cout << "v4为空" << endl;}else{cout << "v4不为空" << endl;cout << "v4的容量" << v4.capacity() << endl;//vector容器容量cout << "v4的大小" << v4.size() << endl;//容器的大小}v4.resize(15, 100);//重新指定容器大小,指定默认填充值printfVector(v4);//如果重新指定的过长;如果未指定默认填充值用0填充v4.resize(5);//重新指定过短,删除超出的部分printfVector(v4);//三、插入和删除//尾插v4.push_back(10);v4.push_back(20);printfVector(v4);//尾删v4.pop_back();printfVector(v4);//插入v4.insert(v4.begin(), 100);//在迭代器指向的位置插入一个元素printfVector(v4);v4.insert(v4.begin(), 2, 1000);//在特定位置插入n个指定元素printfVector(v4);//删除v4.erase(v4.begin());//删除迭代器指向的元素printfVector(v4);v4.erase(v4.begin(), v4.end());//全删printfVector(v4);//清空v3.clear();//清空容器内元素printfVector(v3);//vector容器中的数据存取printfVector(v2);cout << v1[2] << endl;//使用[]的方式访问元素cout << v1.at(0) << endl;//使用at的方式访问元素cout << "最后一个元素为" <<v1.front()<< endl;//获取第一个元素cout << "最后一个元素为" <<v1.back()<< endl;//获取最后一个元素//四、互换元素vector<int>v5(10, 100);vector<int>v6(10, 200);cout << "交换前" << endl;printfVector(v5);printfVector(v6); v5.swap(v6);//交换 cout << "交换后" << endl;printfVector(v5);printfVector(v6);v6.resize(3, 10);printfVector(v6);cout << "重新指定大小后v6的容量大小" << v6.capacity() << endl;vector<int>(v6).swap(v6);//巧用swap收缩内存printfVector(v6);cout << "使用匿名对象的swap函数收缩大小后v6的容量大小" << v6.size() << endl;//五、预留空间vector<int>v7;int* p = NULL;int num = 0;for (int i = 0; i < 1000; i++){v7.push_back(i);if (p != &v7[0]){p = &v7[0];num++;}}cout << num << endl;//容器动态扩展的次数vector<int>v8;v8.reserve(1000);//使用reserve函数预留空间int* p1 = NULL;int num1 = 0;for (int i = 0; i < 1000; i++){v8.push_back(i);if (p1 != &v8[0]){p1 = &v8[0];num1++;}}cout << num1 << endl;
}int main() {test01();
}