目录
string
1.string的一些创建
2.string 的读入和输出:
3.string的一些操作
4.彻底清空string 容器的函数
vector
1.vector的一些创建:
2.vector的一些操作:
3.vector的彻底清空并释放内存:
queue
循环队列:queue
1.循环队列的创建以及操作
优先队列:priority_queue
1.优先队列创建以及操作
stack
1.栈的创建以及操作
deque
1.双端队列的创建以及操作
参考:
所有容器都有.size()函数以及.empty()函数
string
头文件为<string>
如果有窗口中的代码省略了一些东西是因为下面这些有关的代码都在同一文件中,唯独vector那里写的代码是各自独立的
1.string的一些创建
//string的一些创建 string s1; //默认初始化,s1是个空字符串 string s2 = s1; //s2是s1的副本,s2只是与s1的值相同,不是指向同一段地址 string s3 = "hiyaaaa"; //s3是该字符串字面值的副本 string s4(10, 'c'); //s4的内容是"cccccccccc"; string str2(s3, 3, 5); //将str2初始化为s3中从第3位置到第5为止的字符 string str3(s3, 3); //将str3初始化为s3中从第3位置到末尾的字符 string str4("hellonihao", 5); //将str4初始化为从字符串常量开头往后5字节的内容(会输出hello)
2.string 的读入和输出:
//string 的读入和输出: cin >> s1; cout << s1 << endl;; printf("%s", s1.c_str()); //printf不能直接输出string,要写成这样,用.c_str()函数 //用getline读入一整行 string s; getline(cin, s); cout << s << endl; //关于c风格字符串的其他事情: char ss[20]; fgets(ss, 20, stdin); //用法类似于被弃用的gets,只不过第二参数要包括结尾的'\0' cin.getline(ss, 20); //往ss中读入一行
3.string的一些操作
//string支持>,<,>=,<=,==,!=等所有比较操作,按字典顺序进行比较 bool flag = s1 == s3; //字面值和string对象相加: string ss1 = "hello", ss2 = "world"; string ss3 = s1 + "," + s2 + '\n'; //当把string对象和字符字面值及字符串字面值混在一条语句中使用时,必须确保每个加法运算符的两侧的运算对象至少有一个是string: //string的.empty()函数,来判断当前容器是否为空 string arr1, arr2 = "1231"; cout << arr1.empty() << endl; cout << arr2.empty() << endl; //string 的.size()函数,输出字符串里面字符的大小 cout << arr1.size() << endl; cout << arr2.size() << endl;
4.彻底清空string 容器的函数
//彻底清空string 容器的函数(.clear()并不会释放内存空间,只会把size()清零 s1.clear(); //使用shrink_to_fit()函数前,先用clear()清空 s1.shrink_to_fit(); //将s1多余的空间(未使用)释放 cout << "Capacity after shrink_to_fit() is " << s1.capacity()<< " and size is " << s1.size() << '\n'; string().swap(s3); //将s3清零并释放 cout << "Capacity after swap() is " << s3.capacity() << " and size is " << s3.size() << '\n';
vector
头文件为 <vector>
1.vector的一些创建:
vector<int>a; //相当于一个长度动态变化的int数组 vector<int>b[233]; //相当于第一维长233(不可改变),第二位长度动态变化的int数组 vector<double>c(20, 2.2); //创建了一个大小为20的,且内容全为2.2的double数组 int n = 4, m = 5; vector<vector<int>>aa(n, vector<int>(m)); //相当于创建了4*5的二维数组 //其他方法创建二维数组 vector<vector<int>>aa2(n); for (int i = 0; i < n; i++) aa2[i].resize(m, 1); vector<int>arr1(5,1); vector<int>arr2(arr1); //将arr1中的元素复制到arr2中 vector<string>str1(5, "nihao"); vector<string>str2(str1.begin(),str1.end()); //将str1的元素复制到str2中 vector<int>shuzu1={ 1,23,4,5 }; //shuzu1初始化为1,23,4,5 vector<int>shuzu2({ 1,23,4,5 }); //shuzu2初始化为1,23,4,5
2.vector的一些操作:
//.size()输出大小,.empty()判断是否为空,.clear()清空,但无法释放内存 vector<int>a(5, 2); cout << a.size() << endl; cout << a.empty() << endl; a.clear(); cout << a.size() << endl; cout << a.empty() << endl; vector<int>b({ 11,2,3,4,5 }); cout << b.front() << endl; //.front()返回第一个元素 cout << b.back() << endl; //.back()返回最后一个元素 int x = 555; b.push_back(x); //.push_back(x)把元素x插入到尾部 b.pop_back(); //.pop_back()删除最后一个元素 //迭代器,类似于指针,可以用来解引用 for (vector<int>::iterator it = b.begin(); it != b.end(); it++) cout << *it << endl; cout << endl; for (auto it = b.begin(); it != b.end(); it++) //方便起,可以用auto关键字 cout << *it << endl; //.begin()返回vector中第一个元素的迭代器,.end()返回vector的尾部,即其中最后元素的下一个位置 //利用迭代器运用binary_search()函数(头文件为<algorithm>)去寻找值, vector<int>::iterator ie = b.begin(); bool cc = binary_search(b.begin(), ie+3,3 ); cout << endl<< cc << endl;
3.vector的彻底清空并释放内存:
vector<int>a(50, 2); cout << a.capacity() << "\t" << a.size() << endl; a.clear(); //用.shrink_to_fit()函数前,先用clear()清空 a.shrink_to_fit(); cout << a.capacity() << "\t" << a.size() << endl; vector<int>b(50, 2); cout << b.capacity() << "\t" << b.size() << endl; vector<int>().swap(b); //利用交换来清空 cout << b.capacity() << "\t" << b.size() << endl;
ps:
在参考链接那里,有个文章的vector的swap清空写错了,应该改为:vector<int>().swap(nums)
queue
头文件为<queue>
队列是先进先出的结构,从队尾插入,队头弹出
循环队列:queue
1.循环队列的创建以及操作
push // 从队尾插入 pop // 从队头弹出 front // 返回队头元素 back // 返回队尾元素
queue<int> q; //循环队列 //队列没有迭代器,无法遍历输出。 for(int i=0;i<4;i++) { q.push(29 + i); //.push()往队尾插入 } cout << q.front() << endl; //.front()返回队头元素 cout << q.back() << endl; //.back()返回队尾元素 q.pop(); //.pop()删除队头元素 cout << q.front() << endl;
优先队列:priority_queue
1.优先队列创建以及操作
push // 把元素插入堆 pop // 删除堆顶元素 top // 查询堆顶元素(最大值)
#include <iostream> #include <vector> #include <queue> using namespace std; struct ps1 { int a; int b; bool operator <(const ps1& j)const //重载小于号 { return a < j.a; } }; int main() { //优先队列里没有.front()以及.back() priority_queue<int>q; //优先队列,默认大根堆,即堆顶元素为最大值 priority_queue<int, vector<int>, greater<int>>p; //小根堆 priority_queue<ps1>ps; //优先队列,类型为结构体,默认大根堆,要重载小于号, ps.push({ 2, 3 }); //把结构体元素插入堆 ps.push({ 22,33 }); cout << ps.size() << endl; //.size()输出元素长度 cout << ps.top().b << endl; //.top()查询堆顶元素(默认大根堆的话,就是最大值) ps.pop(); //.pop()删除堆顶元素 cout << ps.top().b << endl; cout << ps.empty() << endl; //.empty()判断是否为空 //队列的清空,队列没有.clear()函数 ps = priority_queue<ps1>(); //可以让队列等于一个空队列,来清空里面的值 cout << ps.empty() << endl; //.empty()判断是否为空 priority_queue<ps1>().swap(ps); //通过与空队列交换来释放空间 return 0; }
stack
头文件为<stack>
栈,先进先出,栈顶插入,栈顶弹出
1.栈的创建以及操作
push // 向栈顶插入 pop // 弹出栈顶元素 top // 查询栈顶元素
stack<int> a; //定义栈a a.push(50); //.push()向栈顶插入 a.push(3); a.push(100); cout << a.top() << endl; //.top()查询栈顶元素 a.pop(); //.pop()弹出栈顶元素 cout << a.top() << endl; cout << endl; cout << a.size() << endl; stack<int>().swap(a); //通过交换空栈来释放空间 cout << a.size() << endl;
deque
头文件为<deque>
双端队列deque是一个支持在两端高效插入或删除元素的连续线性存储空间。它就像是vector和queue的结合。与vector相比,deque在头部增删元素仅需要 O(1) 的时间;与queue相比,deque像数组一样支持随机访问。
1.双端队列的创建以及操作
[] // 随机访问 begin/end // 返回deque的头/尾迭代器 front/back // 队头/队尾元素 push_back // 从队尾入队 push_front // 从队头入队 pop_back // 从队尾出队 pop_front // 从队头出队 clear // 清空队列
#include <iostream> #include <vector> #include <deque> using namespace std; int main() { deque<int>q(5, 2); //初始化双端队列q,元素个数是5,都为2; deque<int>p = { 1,2,3 }; //初始化为1,2,3 for (auto k : q) cout << k << " "; cout << endl; for (auto k : p) cout << k << " "; cout << endl; cout << p.front() << endl; //.front()返回队头元素 cout << p.back() << endl; //.back()返回队尾元素 p.push_back(55); //.push_back()队尾入队 p.push_front(33); //.push_front()队头入队 for (auto k = p.begin(); k != p.end(); k++) //.begin()返回双端队列的头迭代器,.end()返回双端队列的尾迭代器 cout << *k << " "; cout << endl; p.pop_back(); //.pop_back()从队尾出队 for (auto k = p.begin(); k != p.end(); k++) cout << *k << " "; cout << endl; p.pop_front(); //.pop_front()从队头出队 for (auto k = p.begin(); k != p.end(); k++) cout << *k << " "; cout << endl; p[0] = 999; for (auto k = p.begin(); k != p.end(); k++) cout << *k << " "; cout << endl; deque<int>().swap(p); //与空双端队列交换,来释放内存 cout << p.size() << endl; return 0; }
参考:
【C++】如何释放vector的内存空间及std::vector::shrink_to_fit用法简介_vector shrink_to_fit-CSDN博客
string对象的内存释放_如何将string内存清空-CSDN博客
C++ string清空并释放内存空间的两种方法(shrink_to_fit()、swap())_c++ string 释放-CSDN博客
顺序容器: 内存管理(shrink_to_fit、capacity、reserve)-CSDN博客
C++中的 c_str() 函数-CSDN博客
c++使用vector创建二维数组的方法_利用vector定义二维数组-CSDN博客
C++ vector用法详解_vector c++ 用法-CSDN博客
【C++】auto关键字_c++ auto-CSDN博客
C++11新特性:基于范围的循环(foreach)_c++11 foreach-CSDN博客
C++:运算符重载_哔哩哔哩_bilibili