[Cpp] C++ 常用的STL学习

vector

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#include <algorithm>
#include <iostream>
#include <vector>

#define MAX_ARRLEN 100

using namespace std;

struct Node
{
int a, b;
};

bool compare(Node x, Node y)
{
return x.a < y.a;
}

template <class T>
void IteratorVector(vector<T> ver)
{
vector<int>::iterator it3;
for (it3 = ver.begin(); it3 != ver.end(); it3++)
{
cout << *(it3) << " ";
}
//cout << endl;
}

//template <class T>
int VectorPra()
{
/*-=----------------------------创建vector---------------------------------*/
cout << "创建vector ";
// vector<T> ver1; //创建一个T类型的默认初始化的空的vec容器
// vector<T> ver2(MAX_ARRLEN); //创建一个T类型容量为MAX_ARRLEN数值全部为0的vector容器
vector<int> ver3(10, 9); //创建一个int类型的容量为10的,内容全是9的vector容器
/*-=----------------------------访问vector容器内容---------------------------------*/
//使用下标直接访问
cout << ver3[1] << " " << endl;
//使用迭代器访问,注意迭代器时前面包含,后面大于1[v.begin() -- 返回一个迭代器,第一个元素; || v.end() -- 返回一个迭代器,最后一个元素的后一个位置]
cout << *(ver3.begin() + 1);

/*-=----------------------------遍历--------------------------------*/
cout << "遍历 ";
//使用下标访问
for (int i = 0; i < ver3.size(); i++)
{
cout << ver3[i] << " ";
}
cout << endl;
//使用迭代器访问 (推荐)
vector<int>::iterator it3;
for (it3 = ver3.begin(); it3 != ver3.end(); it3++)
{
cout << *(it3) << " ";
}
cout << endl;

/*--------------------------------插入----------------------------------*/
cout << "插入 ";
//元素尾部扩张
ver3.push_back(12);

//指定位置插入
ver3.insert(ver3.begin() + 2, 18);
ver3.insert(ver3.end(), 1);

/*--------------------------------删除元素------------------------------------*/
cout << "删除 ";
//删除单个元素(指定位置上面的内容)
ver3.erase(ver3.begin() + 2);

IteratorVector(ver3);

//删除区间内部所有的元素
ver3.erase(ver3.begin() + 2, ver3.begin() + 4);
IteratorVector(ver3);

//全部清空
ver3.clear();
IteratorVector(ver3);

/*-----------------------------------查找元素------------------------------------*/
//没有现成的
// vector_test.cpp : 定义控制台应用程序的入口点。
// https://blog.csdn.net/zhouzhenhe2008/article/details/40595491
/*vector<int> vecIntegerArray;
vecIntegerArray.push_back(50);
vecIntegerArray.push_back(222);
vecIntegerArray.push_back(3);
vecIntegerArray.push_back(44);

cout << "the contents of the vector are: " << endl;
vector<int>::iterator iArrayWalker = vecIntegerArray.begin();
while (iArrayWalker != vecIntegerArray.end())
{
cout << *iArrayWalker << endl;
iArrayWalker++;
}
vector<int>::iterator iElement = find(vecIntegerArray.begin(),
vecIntegerArray.end(), 3);
if (iElement != vecIntegerArray.end())
{
int nPosition = distance(vecIntegerArray.begin(), iElement);
cout << "Value " << *iElement;
cout << " find in the vector at position: " << nPosition + 1 << endl;
}
*/

/*---------------------------------------排序--------------------------------------*/
//递增
sort(ver3.begin(), ver3.end());
//递减
sort(ver3.begin(), ver3.end(), greater<int>());
//自定义结构体排序
vector<Node> v(2);
v[0].a = 1;
v[0].b = 3;
v[1].a = 2;
v[1].b = 4;
sort(v.begin(), v.end(), compare);
cout << v[0].a << endl;

/*-----------------------------------------其他---------------------------------------*/
//元素反向排序
reverse(ver3.begin(), ver3.end());
//获取向量的大小
cout << ver3.size() << endl;
//判断容器是否为空
cout << ver3.empty() << endl;
}

int main()
{
VectorPra();
system("pause");

return 0;
}

map

map就是从键(key)到值(value)的映射。因为重载了 [ ] 运算符,map更像是数组的“高级版”。例如可以用一个map< string,int>month_name来表示“月份名字到月份编号”的映射,然后用 month_name[“July”]=7 这样的方式来赋值。

/*map就是从键(key)到值(value)的映射。因为重载了 [ ] 运算符,map更像是数组的“高级版”。例如可以用一个map< string,int>month_name来表示“月份名字到月份编号”的映射,然后用 month_name[“July”]=7 这样的方式来赋值。*/
#include <iostream>
#include <map>

using namespace std;

void MapPractice()
{
    /*---------------------------------------------------Create----------------------------------------- */
    map<string, int> m;
    /*---------------------------------------------------Insert----------------------------------------- */
    m["Aweier"] = 18;
    m["Laoyinbi"] = 1;
    m["Akuya"] = 145;
    m["Yasina"] = 145;
    cout << m["Aweier"] << endl;
    /*---------------------------------------------------Foreach---------------------------------------- */
    map<string, int>::iterator it;
    for (it = m.begin(); it != m.end(); it++)
    {
        cout << (*it).first << ":" << (*it).second << endl; // it's completely right (can be compiled),but i do not know why did it throw out error;
    }
    /*---------------------------------------------------delete----------------------------------------- */
    m.erase("Yasina");            

    m.clear();
    /*---------------------------------------------------Search----------------------------------------- */
    //使用键值进行查找操作。大多数情况直接用键值访问就行了,很少用到下面的m.find()
    map<string, int>::iterator it1;
    it1 = m.find("Akuya");
    cout << (*it1).first << ":" << (*it1).second << endl;
    //等价于
    cout << "Jack"
         << ":" << m["Jack"] << endl;

    if(m.count("Akuya")){
        cout << "Found" << endl;
    }    
    else{
        cout << "Not Found" << endl;
    }

    if (m["Jack"])
        cout << "FOUND" << endl;
    else
        cout << "NOT FOUND" << endl;

    /*---------------------------------------------------Create----------------------------------------- */

}

int main()
{
    MapPractice();
    system("pause");
    return 0;
}