序列式容器:比如:vector、list、deque、forward_list等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身。
关联式容器:关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是
两者的区别在于set不允许数据冗余,即不能存储相同的数据。multiset可以存储相同的数据。
set<string> s1; //空初始化
int arr[10] = { 4,0,9,3,5,8,7,1,2,11 };
set<int> s(arr, arr + 10); //迭代器区间初始化
set<int> s2(s); //拷贝构造
multiset同理。
迭代器和其他容器类似。
void testset()
{
int arr[10] = { 4,0,9,3,5,8,7,1,2,11 };
set<int> s(arr, arr + 10);
set<int>::iterator it = s.begin();
while (it != s.end())
{
cout << *it << " ";
it++;
}
cout << endl;
set<int>::reverse_iterator rit = s.rbegin();
while (rit != s.rend())
{
cout << *rit << " ";
rit++;
}
}
int main()
{
testset();
return 0;
}
运行结构如下
由于底层是搜索树,因此遍历结果为升序,反向遍历则为降序。
count返回set内值为val的元素的个数,这个函数对于set没有太大作用。要么存在为1,要么不存在为0。因为set不允许数据冗余。对于multiset比较实用,可以统计某个元素的次数。
lower_bound返回第一个大于等于val的元素的迭代器。
upper_bound返回第一个大于val的元素的迭代器。
map和multimap的接口和set类似。最不同的为map支持[ ]的访问。
void test_map()
{
map<string, string> dict;
dict.insert(make_pair("1", "one")); //调用接口
dict.insert({ "2", "two" }); //隐式类型转换
dict.insert(pair<string,string>("0", "zero")); //匿名对象
map<string, string>::iterator it = dict.begin();
cout << it->first << ":" << it->second<<endl;
map<string, int> fruit;
fruit["苹果"]; //插入
fruit["苹果"] = 8; //修改
fruit["香蕉"] = 3; //插入+修改
map<string, int>::iterator it1 = fruit.begin();
while(it1!=fruit.end())
{
cout << it1->first << ":" << it1->second << endl;
++it1;
}
}
由于存储的是pair,所以使用->更方便访问结构内的成员
operator[] 的原理大致如下
map
fruit;
fruit[“苹果”]; //插入
fruit[“苹果”] = 8; //修改
fruit[“香蕉”] = 3; //插入+修改
operator[] 具有以上的功能。
总结
multimap的接口和map类似。但是没有重载operator[],因为key可以有很多个。