首先我们先介绍一下什么是关联式容器
由于set和之前学的容器更为相似,所以先介绍一下set,并测试set的功能
构造函数声明 | 功能介绍 |
---|---|
explicit 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()); | 用first和last区间内的元素构造一个set |
set (const set& x); | 用一个set对象拷贝构造另一个set |
函数声明 | 功能介绍 |
---|---|
iterator begin() | 返回set中起始位置元素的迭代器 |
iterator end() | 返回set中最后一个元素后面的迭代器 |
const_iterator cbegin() const | 返回set中起始位置元素的const迭代器 |
const_iterator cend() const | 返回set中最后一个元素后面的const迭代器 |
reverse_iterator rbegin() | 返回set第一个元素的反向迭代器,即end最后一个元素 |
reverse_iterator rend() | 返回set最后一个元素下一个位置的反向迭代器,即begin起始元素 |
const_reverse_iterator crbegin() const | 返回set第一个元素的反向const迭代器,即cend |
const_reverse_iterator crend() const | 返回set最后一个元素下一个位置的反向const迭代器, 即crbegin |
函数声明 | 功能介绍 |
---|---|
pair |
在set中插入元素x,实际插入的是 |
iterator insert ( iterator position, const value_type& x) | 在set的position位置插入x,实际插入的是 |
template void insert ( InputIterator first, InputIterator last ); | 在set中插入[first, last)区间中的元素 |
void erase ( iterator position ) | 删除set中position位置上的元素 |
size_type erase ( const key_type& x ) | 删除set中值为x的元素,返回删除的元素的个数 |
void erase ( iterator first,iterator last ) | 删除set中[first, last)区间中的元素 |
void swap (set |
交换set中的元素 |
void clear ( ) | 将set中的元素清空 |
iterator find ( const key_type& x ) const | 返回set中值为x的元素的位置 |
size_type count ( const key_type& x ) const | 返回set中值为x的元素的个数 |
举几个例子测试set的功能
void Testset()//测试构造函数、拷贝构造、插入、删除、查找
{
set s;
s.insert(4);
s.insert(5);
s.insert(3);
s.insert(4);
s.insert(2);
s.insert(8);
s.insert(4);
s.insert(5);
s.insert(3);
s.insert(6);
//set::iterator it = s.begin();
//while (it != s.end())
//{
// cout << *it << " ";
// ++it;
//}
set copy(s);
set::iterator it = copy.begin();
while (it != copy.end())
{
cout << *it << " ";
++it;
}
auto t1 = s.find(5);//set自己的find函数,时间复杂度O(logN)
auto t2 = std::find(s.begin(), s.end(), 5);//算法中的find函数,时间复杂度为O(N)
if (t2 != s.end())
{
s.erase(t2);
}
s.erase(5);
s.erase(3);
//s.clear();
for (auto e : s)
{
cout << e << " ";
}
cout << endl;
}
举几个例子测试multiset的功能
//测试multiset,基本接口个set一样,唯一区别是multiset允许序列中有重复元素
void Test_multiset()
{
multiset ms;
ms.insert(2);
ms.insert(3);
ms.insert(5);
ms.insert(4);
ms.insert(5);
ms.insert(1);
ms.insert(5);
ms.insert(2);
ms.insert(7);
ms.insert(6);
multiset::iterator mit = ms.begin();
while (mit != ms.end())
{
cout << *mit << " ";
++mit;
}
cout << endl;
}
函数声明 | 功能介绍 |
---|---|
map (const key_compare& comp = key_compare(), const allocator_type& alloc = allocator_type()) | 构造一个空的map |
template map (InputIterator first, InputIterator last, const key_compare& comp = key_compare(), const allocator_type& alloc =allocator_type()) | 用[first,last)区间中的元素构造map |
map (const map& x) | map的拷贝构造 |
举个栗子测试一下map的构造函数
void Testmap()
{
map m;
m.insert(pair(1, 2));
m.insert(pair(2, 3));
m.insert(pair(5, 1));
m.insert(std::make_pair(1, 5));
m.insert(std::make_pair(7, 5));
m.insert(std::make_pair(9, 5));
map copy(m);
map::iterator mit = m.begin();
while (mit != m.end())
{
cout << mit->first << ":" << mit->second << " ";
++mit;
}
cout << endl;
for (auto e : copy)
{
cout << e.first << ":" << e.second << " ";
}
cout << endl;
}
举个栗子具体来看看
//find insert
void Testmap2()
{
string strs[] = { "苹果", "苹果", "西瓜", "苹果", "西瓜", "草莓", "草莓", "香蕉", "苹果", "苹果", "香蕉", "香蕉", "苹果", "苹果" };
map countmap;
for (const auto& e : strs)
{
//std::map::iterator it = countmap.find(e);
auto it = countmap.find(e);
if (it != countmap.end())
{
it->second++;
}
else
{
countmap.insert(make_pair(e, 1));
}
}
//map::iterator cit = countmap.begin();
auto cit = countmap.begin();
while (cit != countmap.end())
{
cout << cit->first << ":" << cit->second << endl;
++cit;
}
cout << endl;
}
//insert
void Testmap3()
{
string strs[] = { "苹果", "苹果", "西瓜", "苹果", "西瓜", "草莓", "草莓", "香蕉", "苹果", "苹果", "香蕉", "香蕉", "苹果", "苹果" };
map countmap;
for (const auto& e : strs)
{
//pair
注意:multimap和map的唯一不同就是:map中的key是唯一的,而multimap中key是可以重复的。