STL具有容器概念和容器类型。概念是具有名称(如容器、序列容器、关联容器等)的通用类别;容器类型时可用于创建具体容器对象的模板。旧的容器有11个,分别为deque、list、queue、priority_queue、stack、vector、map、multimap、set、multiset和bitset。
博主主要总结的是关联容器set和multimap基本用法,其它容器的原理和用法可以参考《C++ Primer Plus》(第6版)中文版第695-706页。
一、关联容器set
1.1 set原理
STL set模拟了多个概念,是关联集合,可反转、排序,键值是唯一的,不能存储多个相同的值,并且会自动排序(关联容器特性之一),用法跟vector容器类似。
#include <set> //STL容器之一
using namespace std;
set<string> A;
1.2 set用法示例(关联容器自动排序容器内对象的值)
#include <iostream>
#include <string>
#include <iterator>
#include <algorithm>
#include <set> //STL容器之一
using namespace std;
int main()
{
/*遍历和输出关联容器的值*/
string s1[3] = { "str3", "str2", "str1" };
set<string> A(s1,s1+3); //定义并且初始化容器set
ostream_iterator<string, char> out(cout, " ");
copy(A.begin(), A.end(), out);
cout << endl;
/*输出两个关联容器并集合的值*/
string s2[3] = { "str0", "str5", "str3" };
string s3[3] = { "str9", "str5", "str1" };
set<string> A1(s2, s2 + 3); //定义并且初始化容器set
set<string> B(s3, s3 + 3); //定义并且初始化容器set
set<string> C;
cout << endl;
set_union(A1.begin(), A1.end(), B.begin(), B.end(), insert_iterator<set<string>>(C,C.begin()));
copy(C.begin(), C.end(), out);
cout << endl;
system("pause");
return 0;
}
二、关联容器multimap
1.1 multimap原理
容器multimap跟set相似,也是可反转、经过排序的关联容器,但是键和值的类型不同,且同一个键可能有多个值相关联。下面是声明:
#include <map> //STL容器之一
using namespace std;
multimap<int, string> codes;
pair<const int, string> item(123, "city");
codes.insert(item);
//匿名创建pair对象
codes.insert(pair<const int, string>(124, "city124"));
上述声明中,容器codes里面每个对象的值的类型为pair<class T,class U>,也就是pair<const int,string>。
1.2 multimap用法示例(关联容器自动排序容器内对象的值)
#include <iostream>
#include <string>
#include <iterator>
#include <algorithm>
#include <set> //STL容器之一
#include <map>
using namespace std;
int main()
{
multimap<int, string> codes;
pair<const int, string> item(123, "city");
codes.insert(item);
//匿名创建pair对象
codes.insert(pair<const int, string>(124, "city124"));
//pair<multimap<int, string>::iterator, multimap<int, string>::iterator> range = codes.equal_range(124);
//auto range的类型为: pair<multimap<int, string>::iterator, multimap<int, string>::iterator> range
auto range = codes.equal_range(124);
for (auto it = range.first; it != range.second; ++it)
cout << "(*it).first==" << (*it).first << "\t(*it).second==" << (*it).second << endl;
cout << endl;
system("pause");
return 0;
}
参考内容:
《C++ Primer Plus》(第6版)中文版 695页,702-706页