【常用C++STL】(一)vector动态数组+set集合+map映射表

常用C++STL

一、vector动态数组

vector,可以理解为 动 态 数 组 动态数组 。顾名思义,就是可以增加、删除的数组。
但是vector怎么用呢?请看下面一个例子:

#include<iostream>
#include<vector>//要想使用vector,必须导入vector库。
using namespace std;
int main(){ 
	vector<int> a;//这样就声明了一个int类型的动态数组
	a.push_back(4);//表示在数组中增加4这个数。数组内容为:{4}
	a.push_back(5);//{4,5}
	a.push_back(6);//{4,5,6}
	cout << a.size() << endl;//a.size()表示动态数组的长度,即有多少个元素。
	a.clear();//清空数组
	cout << a.size() << endl;
	return 0;
}

运行结果为:

3
0

注:vector是用指针链表实现的,所以比一般的数组要快

二、set集合

集合,是数学中的一个定义,这里就不多说了。在c++里,用set表示集合。而且,c++里的集合有如下的特征:
①不会有重复元素,如果有重复元素会自动删除其中一个。
②自动按照从小到大的顺序进行排列。
注:set是用红黑树(又称自动排序树)实现的,比vector及一般的数组都要快。

#include<iostream>
#include<set>//要想使用set,必须导入set库。
using namespace std;
int main(){ 
	set<int> a;//这样就声明了一个int类型的集合
	a.insert(4);//表示在集合中增加4这个数。集合内容为:{4}
	a.insert(5);//{4,5}
	a.insert(6);//{4,5,6}
	a.erase(5);//表示删除5这个数。集合内容为:{4,6}
	a.erase(7);//虽然集合里没有7,但删了也不报错。{4,6}
	if(!a.count(3)){ //a.count(3)就表示集合a里3的数量,由于最多只能是一个,所以用来判断有没有3。
		a.insert(3);//由于集合里没有3,所以就插入了3。{3,4,6}
	}
	cout << a.size() << endl;//a.size()表示集合的长度,即有多少个元素。
	//输出时千万不能用普通的输出方式,否则会报错的。必须要用迭代器。
	for(set<int>::iterator it = a.begin(); it != a.end(); it++){ //特别注意,it是一个指针。
		cout << *it << " ";//由于it是一个指针,所以要用*it。
	}
	a.clear();//清空集合
	return 0;
}

运行结果:

3
3 4 6

此外,还有一些算法。时间复杂度请见下表:(n为元素个数)

函数功能时间复杂度
insert插入一个元素 O ( l o g n ) O(logn) O(logn)
erase删除一个元素 O ( l o g n ) O(logn) O(logn)
count统计个数 O ( l o g n ) O(logn) O(logn)
size获取元素个数 O ( 1 ) O(1) O(1)
clear清空集合 O ( n ) O(n) O(n)

另外的函数,详见官方参考文档.

附加:结构体与集合

结构体在放到集合里时会报错,因为计算机并不知道结构体之间怎么比大小。所以,需要重载运算符号。下面我们来看一下实例:
输入一些点的x、y坐标,要求按从小到大的顺序输出。
按往常来,我们先建造一个点的结构体。

struct Node{ 
	int x, y;
	//重头戏来了
	bool operator< (const Node &rhs) const{ //第一行有点难理解,只需要记忆就行了。
		if(x == rhs.x){ 
			return y < rhs.y;
		} else { 
			return x < rhs.x;
		}
	}
};

接着,就可以放进set并输出了。

int main(){ 
    int n;
    set<Node> v;
    cin >> n;
    for(int i = 0; i < n; i++){ 
        Node temp;
        cin >> temp.x >> temp.y;
        v.insert(temp);
    }
    for(set<Node>::iterator it = v.begin(); it != v.end(); it++){ 
        cout << it->x << " " << it->y << endl;//it->x就相当于(*it).x。
    }
    return 0;
}

三、map映射表

map,映射表。既然叫映射表,就得由两个元素组成一对,那map就存储这一对一对的元素。所以,在创建时,应该有两个内容,第一个是关键字,第二个是值。例如, m a p < s t i r n g , i n t > map<stirng, int> map<stirng,int>就创建了一个字符串映射整数的集合。有的小伙伴可能不理解映射,是就相当于关联的意思。

#include<map>
...
int main(){ 
	map<string, int> m;//m是一个映射表,表示每个同学所在的班级。
	
	return 0;
}

初始的时候,m映射表是空的,想要插入一个元素,有两种方法。
1.利用函数。

m.insert(make_pair("Tom", 1));
m.insert(make_pair("Alice", 2));
m.insert(make_pair("John", 1));
m.insert(make_pair("Tom", 2));//因为Tom已经映射了1,就不能映射2了。所以本次操作无效。

2.直接插入。(比较方便)

m["Tom"] = 1;//等价于m.insert(make_pair("Tom", 1))。
m["Alice"] = 2;
m["John"] = 1;

想要输出,直接用:

cout << "Tom is in class " << m["Tom"] << endl;

运行结果:

"Tom is in class 1"(不带引号)

想要知道一个元素是否在映射表里,就可以用count函数。

if(count("Mary")){ 
	cout << "Mary is in class " << m["Mary"];
} else { 
	cout << "Mary has no class."
}

拜拜!记得点赞关注哦!

    原文作者:hexu2010
    原文地址: https://blog.csdn.net/hexu2010/article/details/113307063
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞