stl容器分为两类,分别是序列容器和关联式容器,学习关联式容器可以帮助我们去解决去重等问题。
在介绍set和map前,我们必须拥有一些必备的知识储备,比如像关联式容器与键值对等基础知识。
stl容器分为两类,分别是序列容器和关联式容器.
键值对指的是一种映射关系,这种结构拥有两个变量
STL中的关联式结构有两种结构组成:树型结构(红黑树)和哈系结构,而map和set都是使用树型结构所构成的。
set 虽然只允许插入一个数值value,但其内部的实现还是键值对
函数 | 接口说明 |
---|---|
set (const key_compare& comp = key_compare(), const allocator_type& alloc = allocator_type()); | 构造空的set |
set (InputIterator first, InputIterator last, const key_compare& comp = key_compare(), const allocator_type& alloc = allocator_type()); | 使用迭代器构建set |
set (const set& x); | 拷贝构造 |
函数 | 功能说明 |
---|---|
pair |
插入元素x,实际插入的是 |
void erase(iterator position) | 删除set中position位置的节点 |
size_type erase( const key_type& x) | 删除set中值为x的元素,返回删除的元素的个数 |
void swap( set& x) | 交换两个set中的元素。 |
void clear() | 将set中的元素清空 |
void erase(iterator first, iterator last) | 删除set中(first, last)区间的元素 |
iterator find(const key_type& x) const | 返回值为x的迭代器 |
size_t count(const key_type& x) | 返回元素x出现的次数 |
现在来看看使用的方式吧。
void test()
{
vector<int> nums{1,2,3,4,3,4,5,6,7,8,9};
//利用迭代器进行构造
set<int> st(nums.begin(), nums.end());
for(auto& key : st)
{ //迭代器进行遍历
cout << key << " ";
}
cout << endl;
for(auto it = st.rbegin(); it != st.rend(); ++it)
{ //反迭代器进行遍历
cout << *it << " ";
}
cout << endl;
cout << "st.count(): " << st.count(4) << endl;
}
map与set不同的是map是使用
map所拥有的函数基本和set保持一致,所以这里只介绍不同的地方
map | |
---|---|
operator[ ] | 返回key对应的value |
at() | 返回key对应的value |
注意:operator[ ]和at()都是返回key对应的value的引用,但如果key不存在,operator[]会用默认key与value构建键值对并插入,返回这默认value,at()则直接抛出异常。
void test()
{
map<string, string> dict;
dict.insert(make_pair("insert", "插入"));
dict.insert(make_pair("erase", "删除"));
dict.insert(make_pair("left", "左边"));
dict.insert(make_pair("string", "字符串"));
string str;
while (cin>>str) //查找单词
{
auto ret = dict.find(str); //查找成功返回iterator position,失败返回end();
if (ret != dict.end())
{
cout << str << ":" << ret->second << endl;
}
else
{
cout << "单词拼写错误" << endl;
}
}
string strs[] = { "苹果", "西瓜", "苹果", "樱桃", "苹果", "樱桃", "苹果", "樱桃", "苹果" };
map<string, int> m;
for(auto& it : strs)
{
m[it]++; //如果map中没有该key则创建一个
}
for(auto& it : m)
cout << it.first << ":" << it.second << endl;
}
multiset和multimap 与其原生版本不同的是multi版本可以允许重复数据的存在,其接口和原生版本没有区别,但multimap和map除外,multimap没有了operator[]的接口。
博客主页:主页
我的专栏:C++
我的github:github