C++进阶:详细讲解容器set与map(pair、multiset、multimap)
上次介绍了搜索二叉树:C++进阶:二叉搜索树介绍、模拟实现(递归迭代两版本)及其应用
为了介绍后面的AVLTree和红黑树,我们要进行一些铺垫,就是set与map的介绍啦
1.关联式容器与序列式容器
关联式容器和序列式容器是 C++ 中两种不同的容器类型
-
关联式容器:
- 关联式容器主要包括
std::set
,std::map
,std::multiset
,std::multimap
等。 - 这些容器是基于键值对(
<key, value>
结构)的概念,通过键==(key)来唯一标识元素==。 - 关联式容器内部使用二叉搜索树(通常是红黑树)或类似的数据结构,以保持元素的有序性。
- 插入、删除、查找等操作的平均时间复杂度是 O(log n)。
- 关联式容器主要包括
-
序列式容器:
- 序列式容器包括
std::vector
,std::list
,std::deque
,std::array
等。 - 这些容器是基于线性结构的,元素在容器中的位置是由插入的顺序决定的。
- 插入、删除、查找等操作的平均时间复杂度因容器类型而异,但在最差情况下,可能达到 O(n)。
- 序列式容器包括
2.C++中的键值对——pair
在C++中,键值对是一种数据结构,通常用于表示关联关系
键值对由两部分组成:键(Key)和值(Value)。这种结构允许通过键来检索和关联对应的值,key代表键值,value表示与key对应的信息
2.1pair定义
std::pair
是C++标准库中提供的一个简单的键值对实现。它包含在 <utility>
头文件中。一个 std::pair
有两个公有成员:first
和 second
,分别表示键和值==(first<= =>key ; second<= =>value)==
STL中关于键值对的定义:
template <class T1, class T2>
struct pair
{
typedef T1 first_type;
typedef T2 second_type;
T1 first;
T2 second;
pair() //构造函数
: first(T1()), second(T2())
{}
pair(const T1& a, const T2& b) //拷贝构造
: first(a), second(b)
{}
};
2.2pair的对象创建与访问
文档中的构造函数的介绍:
- 默认构造函数:
pair();
- 默认构造函数创建一个空的
std::pair
对象,不包含任何值。
- 拷贝构造函数:
template<class U, class V> pair (const pair<U,V>& pr);
- 拷贝构造函数用于从另一个
std::pair
对象pr
中复制键值对来构造一个新的std::pair
对象。
- 初始化构造函数:
pair (const first_type& a, const second_type& b);
- 初始化构造函数接受两个参数
a
和b
,分别用于初始化std::pair
对象的first
和second
成员变量。
void test_pair()
{
pair<int, char> p1;//空参
pair<int, char> p2(2, '2');
pair<int, char> p3(p2);//拷贝构造
cout << p1.first << " " << p1.second << endl;;
cout << p2.first << " " << p2.second << endl;
cout << p3.first << " " << p3.second << endl;
}
int main()
{
test_pair();
return 0;
}
2.3make_pair() 函数和使用{}
-简化创建过程
void test_pair2()
{
auto p4 = make_pair(2, 'c');//使用make_pair
pair<int, char> p5 = { 3,'d' };//c++11后,使用{ }
cout << p4.first << " " << p4.second << endl;
cout << p5.first << " " << p5.second << endl;
}
int main()
{
test_pair2();
return 0;
}
我们能使用
{}
(初始化列表),是因为:构造函数匹配。如果使用花括号进行初始化,编译器会尝试匹配合适的构造函数。对于pair
,存在接受两个参数的构造函数,因此可以通过初始化列表直接构造键值对