目录
一、C++ STL之动态数组vector(⽮量)的使⽤
在C语⾔⾥⾯⽤ int arr[] 定义数组,它的缺点是数组的⻓度不能随意改变,⽽C++⾥⾯有⼀个动态数组 vector(叫做动态数组或者不定⻓数组更好理解) 它能够在运⾏阶段设置数组的⻓度、在末尾增加新的数据、在中间插⼊新的值、⻓度任意被改变,使⽤的时候要引⼊头⽂件 #include <.vector> 和 using namespace std; vector 、 stack 、 queue 、 map 、 set 这些在C++中都叫做容器,这些容器的 ⼤⼩都可以⽤ .size()获取到,就像 string s 的⻓度⽤ s.length() 获取⼀样。#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> a1; // 定义⼀个vector a1,定义的时候没有分配⼤⼩
cout << a1.size(); // 输出vector a1的⼤⼩,此处应该为0
return 0; }
vector 可以⼀开始不定义⼤⼩,之后⽤ resize ⽅法分配⼤⼩,也可以⼀开始就定义⼤⼩,之后还可以对它插⼊删除动态改变它的⼤⼩,⽽且不管在 main 函数⾥还是在全局中定义,它都能够直接将所有的值初始化为0。
vector<int> a(10); // 直接定义⻓度为10的int数组,默认这10个元素值都为0
// 或者
vector<int> a1;
a1.resize(8); //先定义⼀个vector变量a1,然后将⻓度resize为8,默认这8个元素都是0
// 在定义的时候就可以对vector变量进⾏初始化
vector<int> a3(100, 9);// 把100⻓度的数组中所有的值都初始化为9
// 访问的时候像数组⼀样直接⽤[]下标访问即可
a[1] = 2;
cout << a[0];
以下是⼀些常⽤的 vector ⽅法:
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> a; // 定义的时候不指定vector的⼤⼩
cout << a.size() << endl; // 这个时候size是0
for (int i = 0; i < 10; i++) {
a.push_back(i); // 在vector a的末尾添加⼀个元素i
}
cout << a.size() << endl; // 此时会发现a的size变成了10
vector<int> b(15); // 定义的时候指定vector的⼤⼩,默认b⾥⾯元素都是0
cout << b.size() << endl;
for (int i = 0; i < b.size(); i++) {
b[i] = 15;
}
for (int i = 0; i < b.size(); i++) {
cout << b[i] << " ";
}
cout << endl;
vector<int> c(20, 2); // 定义的时候指定vector的⼤⼩并把所有的元素赋 ⼀个指定的值
for (int i = 0; i < c.size(); i++) {
cout << c[i] << " ";
}
cout << endl;
for (auto it = c.begin(); it != c.end(); it++) { // 使⽤迭代器的⽅式访问vector
cout << *it << " ";
}
return 0;
}
容器 vector 、 set 、 map 这些遍历的时候都是使⽤迭代器访问的, c.begin() 是⼀个指针,指向容器的第⼀个元素, c.end() 指向容器的最后⼀个元素的后⼀个位置,所以迭代器指针 it 的for循环判断条件是 it != c.end()
二、C++ STL之集合set的使⽤
set 是集合,⼀个 set ⾥⾯的各元素是各不相同的,⽽且 set 会按照元素进⾏从⼩到⼤排序 以下是 set 的常⽤⽤法:#include <iostream>
#include <set>
using namespace std;
int main() {
set<int> s; // 定义⼀个空集合s
s.insert(1); // 向集合s⾥⾯插⼊⼀个1
cout << *(s.begin()) << endl; // 输出集合s的第⼀个元素 (前⾯的星号表示要对指针取值)
for (int i = 0; i < 6; i++) {
s.insert(i); // 向集合s⾥⾯插⼊i
}
for (auto it = s.begin(); it != s.end(); it++) { // ⽤迭代器遍历集合s⾥⾯的每⼀
个元素
cout << *it << " ";
}
cout << endl << (s.find(2) != s.end()) << endl; // 查找集合s中的值,如果结果等于s.end()表示未找到 (因为s.end()表示s的最后⼀个元素的下⼀个元素所在的位置)
cout << (s.find(10) != s.end()) << endl; // s.find(10) != s.end()表示能找到10
这个元素
s.erase(1); // 删除集合s中的1这个元素
cout << (s.find(1) != s.end()) << endl; // 这时候元素1就应该找不到啦~
return 0;
}
三、C++ STL之映射map的使⽤
map 是键值对,⽐如⼀个⼈名对应⼀个学号,就可以定义⼀个字符串 string 类型的⼈名为“键”,学号 int 类型为“值”,如map<.string, int> m; 当然键、值也可以是其它变量类型,map 会⾃动将所有的键值对按照键从⼩到⼤排序,map 使⽤时的头⽂件 #include <.map> 以下是 map 中常⽤的⽅法:#include <iostream>
#include <map>
#include <string>
using namespace std;
int main() {
map<string, int> m; // 定义⼀个空的map m,键是string类型的,值是int类型的
m["hello"] = 2; // 将key为"hello", value为2的键值对(key-value)存⼊map中
cout << m["hello"] << endl; // 访问map中key为"hello"的value, 如果key不存在,则返
回0
cout << m["world"] << endl;
m["world"] = 3; // 将"world"键对应的值修改为3
m[","] = 1; // 设⽴⼀组键值对,键为"," 值为1
// ⽤迭代器遍历,输出map中所有的元素,键⽤it->first获取,值⽤it->second获取
for (auto it = m.begin(); it != m.end(); it++) {
cout << it->first << " " << it->second << endl;
}
// 访问map的第⼀个元素,输出它的键和值
cout << m.begin()->first << " " << m.begin()->second << endl;
// 访问map的最后⼀个元素,输出它的键和值
cout << m.rbegin()->first << " " << m.rbegin()->second << endl;
// 输出map的元素个数
cout << m.size() << endl;
return 0;
}
四、C++ STL之栈stack的使⽤
栈 stack 在头⽂件#include <.stack> 中,以下是常⽤⽤法:#include <iostream>
#include <stack>
using namespace std;
int main() {
stack<int> s; // 定义⼀个空栈s
for (int i = 0; i < 6; i++) {
s.push(i); // 将元素i压⼊栈s中
}
cout << s.top() << endl; // 访问s的栈顶元素
cout << s.size() << endl; // 输出s的元素个数
s.pop(); // 移除栈顶元素
return 0;
}
五、 C++ STL之队列queue的使⽤
队列 queue 在头⽂件 #include <.queue> 中,以下是常⽤⽤法:#include <iostream>
#include <queue>
using namespace std;
int main() {
queue<int> q; // 定义⼀个空队列q
for (int i = 0; i < 6; i++) {
q.push(i); // 将i的值依次压⼊队列q中
}
cout << q.front() << " " << q.back() << endl; // 访问队列的队⾸元素和队尾元素
cout << q.size() << endl; // 输出队列的元素个数
q.pop(); // 移除队列的队⾸元素
return 0;
}