C++ STL 快速入门指南

1. 关于C++头文件

C++的头文件一般是没有像C语言的 .h 这样的扩展后缀的,一般情况下C语言里面的头文件去掉 .h 然后在前面加个 c 就可以继续在C++文件中使用C语言头文件中的函数啦~比如:
1 #include <cmath> // 相当于C语言里面的#include <math.h> 
2 #include <cstdio> // 相当于C语言里面的#include <stdio.h> 
3 #include <cctype> // 相当于C语言里面的#include <ctype.h> 
4 #include <cstring> // 相当于C语言里面的#include <string.h>

2. C++特有的bool变量

在C语言中用0、1表示 true、false。但是在C++中可以直接用true、false,一切非0数表示true,只有0表示false。

3.C++的结构体struct和C语言的结构体的区别

定义好结构体 stu 之后,使用这个结构体类型的时候,C语言需要写关键字 struct ,而C++里面可以省略不写:
1 struct stu {
2     int grade;
3     float score;
4 };
5 struct stu arr1[10]; // C语言里面需要写成struct 
6 stu stu arr2[10];// C++里面不用写struct,直接写stu就好了~

4. C++中传值与传引用

记住一句话,传值相当于做了一份复制拷贝,而通过引用传递参数只有一份拷贝,而且能修改传入值。

5. C++ STL之动态数组vector(矢量)的使用

#include <iostream>
#include <vector>
using namespace std;

int main() {
    vector<int> v;  //初始化未设置大小
    cout << v.size() << endl;
    for (int i = 0; i < 10; ++i) {
        v.push_back(i);
    }
    cout << v.size() << endl;
    vector<int> v1(10); //初始化设置大小
    cout << v1.size() << endl;
    for (int j = 0; j < 10; ++j) {
        v.push_back(j);
    }
    vector<int> v2(10, 2); //初始化设置大小10并且设置默认值为2
    for (int k = 0; k < v2.size(); ++k) {
        cout << v2[k] << " ";
    }
    cout << endl;
    for (auto it = v2.begin(); it != v2.end(); it++) { //使用迭代器遍历
        cout << *it << " ";
    }
    return 0;
}
 

6. C++ STL之集合set的使用

 1 #include <iostream>
 2 #include <vector>
 3 #include <set>
 4 using namespace std;
 5 
 6 int main() {
 7     set<int> s; //定义一个集合
 8     s.insert(1); //向集合插入一个元素
 9     cout << *(s.begin()) << endl; //输出集合的首元素(前面的星号表示对指针取值)
10     for (int i = 0; i < 6; ++i) {
11         s.insert(i); //向集合s里插入i
12     }
13     for (auto it = s.begin(); it != s.end(); ++it) { //用迭代器遍历集合s里面的面一个元素
14         cout << *it << " ";
15     }
16     cout << endl << (s.find(2) != s.end()) << endl; //使用find函数查找为2的元素,返回该指针。
17     // 如果查找失败返回末尾end指针
18     s.erase(1); //删除集合s中元素1
19     cout << endl << (s.find(1) != s.end()) << endl; //此时再查找元素1就查不到了
20     return 0;
21 }

7. C++ STL之映射map的使用

 1 #include <map>
 2 using namespace std;
 3 
 4 int main() {
 5     map<string, int> m; //定义一个空的map m,键是string类型,值是int类型
 6     m["hello"] = 2; //将key为hello,value为2的键值对存入map中
 7     cout << m["hello"] << endl; //访问map中键为"hello"的value,如果key不存在,则返回0
 8     cout << m["world"] << endl;
 9     m["world"] = 3; // 将"world"键对应的值修改为3
10     m[","] = 1; // 设立一组键值对,键为"," 值为1
11     // 用迭代器遍历,输出map中所有的元素,键用it->first获取,值用it->second获取
12     for (auto it = m.begin(); it != m.end(); it++) {
13         cout << it->first << " " << it->second; 
14     }
15     //访问第一个元素,输出它的键和值
16     cout << m.begin()->first << " " << m.begin()->second << endl;
17     //访问最后一个元素,输出它的键和值
18     cout << m.rbegin()->first << " " << m.rbegin()->second << endl;
19     cout << m.size() << endl;
20     return 0;
21 }

 

8. C++ STL之栈stack的使用

 1 #include <stack>
 2 using namespace std;
 3 
 4 int main() {
 5     stack<int> s; // 定义一个空栈s
 6     for (int i = 0; i < 6; i++) {
 7         s.push(i); // 将元素i压入栈s中
 8     }
 9     cout << s.top() << endl; // 访问s的栈顶元素
10     cout << s.size() << endl; // 输出s的元素个数
11     s.pop(); // 移除栈顶元素
12     return 0;
13 }
 

9. C++ STL之队列queue的使用

 1 #include <queue>
 2 #include <iostream>
 3 using namespace std;
 4 
 5 int main() {
 6     queue<int> q; // 定义一个空队列q
 7     for (int i = 0; i < 6; i++) {
 8         q.push(i); // 将i的值依次压入队列q中
 9     }
10     cout << q.front() << " " << q.back() << endl; // 访问队列的队首元素和队尾元素
11     cout << q.size() << endl; // 输出队列的元素个数
12     q.pop(); // 移除队列的队首元素
13     return 0;
14 }

 

10. C++ STL之无序集unordered_set的使用

 1 #include <unordered_set>
 2 using namespace std;
 3 
 4 int main() {
 5     unordered_set<int> s1;
 6     s1.insert(2);
 7     s1.insert(3);
 8     s1.insert(1);
 9     for (auto it = s1.begin(); it != s1.end(); it++) { //unordered_set未按照字母顺序存储
10         cout << *it << " ";
11     }
12     cout << endl;
13     set<int> s2;
14     for (int i = 5; i > 0; --i) {
15         s2.insert(i);
16     }
17     for (auto it = s2.begin(); it != s2.end(); it++) { //set按照字母顺序存储
18         cout << *it << " ";
19     }
20     return 0;
21 }

11. C++ STL之无序映射unordered_map的使用

 1 #include <unordered_map>
 2 #include <iostream>
 3 using namespace std;
 4 
 5 int main() {
 6     unordered_map<string, int> unmap;
 7     unmap["Banana"] = 7;
 8     unmap["Orange"] = 6;
 9     unmap["Apple"] = 1;
10     for (auto it = unmap.begin(); it != unmap.end(); it++) {
11         cout << it->first << " ";
12     }
13     unmap.erase("Apple");
14     return 0;
15 }

 

12. C++的位运算bitset

 1 #include <bitset>
 2 #include <iostream>
 3 using namespace std;
 4 
 5 int main() {
 6     bitset<5> b; //长度为5的初始值0的比特数
 7     cout << b << endl;
 8     // 初始化方式:
 9     // bitset<5> b; 都为0
10     // bitset<5> b(u); u为unsigned int,如果u = 1,则输出b的结果为00001
11     // bitset<8> b(s); s为字符串,如"1101",则输出b的结果为00001101,在前面补0
12     // bitset<5> b(s, pos, n); 从字符串的s[pos]开始,n位⻓度
13     // 注意,bitset相当于一个数组,但是它是从二进制的低位到高位分别为b[0]、b[1]......的
14     // 所以按照b[i]方式逐位输出和直接输出b结果是相反的
15     for(int i = 0; i < 5; i++)
16         cout << b[i]; // 如果bitset<5> b("11"); 则此处输出11000(即正常二进制顺序的倒序)
17     cout << endl << b.any(); //b中是否存在1的二进制位
18     cout << endl << b.none(); //b中不存在1吗?
19     cout << endl << b.count(); //b中1的二进制位的个数
20     cout << endl << b.size(); //b中二进制位的个数
21     cout << endl << b.test(2); //测试下标为2处是否二进制位为1
22     b.set(4); //把b的下标为4处置1
23     b.reset(); //所有位归零
24     b.reset(3); //b的下标3处归零
25     b.flip(); //b的所有二进制位逐位取反
26     unsigned long a = b.to_ulong(); //b转换为unsigned long类型
27     return 0;
28 }
 

13. C++11里面很好用的auto声明

当然这个在算法里面最主要的用处不是这个,而是在STL中使用迭代器的时候, auto 可以代替一大⻓ 串的迭代器类型声明:
1 // 本来set的迭代器遍历要这样写:
2 for(set<int>::iterator it = s.begin(); it != s.end(); it++) {
3     cout << *it << " ";
4 }
5 // 现在可以直接替换成这样的写法:
6 for(auto it = s.begin(); it != s.end(); it++) {
7     cout << *it << " ";
8 }
 
水滴试穿,笨鸟可以先飞!

猜你喜欢

转载自www.cnblogs.com/sheepcore/p/12362799.html