C++之set,map的使用
set是按一定顺序来存储数据的容器,而且数据是独一无二,不重复的。并且数值不能修改,但是可以插入和删除。
接下来我们来看set的使用
迭代器进行初始化
数组进行初始化
构造进行初始化
赋值重载进行初始化
我们也可以在上面看出set会自动去重,默认从小到大进行排序。
迭代器部分
当然这是一个普通的迭代器是不支持修改的
修改部分
insert
相对而言第一种插入使用会更多
earse
find
我们看到算法库和set成员函数都有find,但是我们用set的因为两个时间效率上有巨大的差异,set的find底层使用二叉搜索树来实现的最优时间复杂度是log2N。
swap就是解决深拷贝效率太低的问题,clear清除所有的节点。
接下来我们来看count
就是找有没有搜索的数字存在,在set里面只返回1或者0.
count的使用相对于find找是否这个数字存在是相对简单的。
lower_bound与upper_bound
两者都是返回迭代器。前者是返回比传入数值>=的第一个迭代器的位置,后者则是返回比传入值<的第一迭代器
multiset和set的差异
可以看出multiset是支持数据的重复
主要区别点在于multiset支持值冗余,那么insert/find/count/erase都围绕着支持值冗余有所差异。
insert
find
返回的迭代器是中序遍历第一次出现相同value的迭代器的位置
count
multiset返回value出现的次数
erase
会删除所有与value相同的数
map的使用
Map(映射)是一种关联结构,用来把一组“键(Key)”和对应的“值(Value)”成对存储起来,形成 Key → Value 的对应关系。
可以这样理解:
像一本字典:通过“单词”(Key)快速查到“释义”(Value);
而pair就是来完成这个操作
首先我们来看pair
先来看构造
还可以用赋值重载和make_pair
当然也是支持initialize初始化
我们将这些运用到map里面
接下来遍历
值得注意的是返回的迭代器解引用是pair的一个整体,我们要访问里面的元素就要用箭头或者是.。我们仔细看也可以看出这个也是有排序的。
当然除了上面这两种方式我们还可以用结构化绑定
注意map这里key可以修改,T不能修改
insert
直接insert一个pair对象
传入迭代器区间
erase
可以删除一个迭代器位置的值,一个迭代器区间,或者是一个pair里面的第一个first。
find
count
和set里面的count是相类似的,map的count也是只能返回1或者0.
接下来我们先来看一个例子来理解operater[]
通过这样我们可以很简单的统计出水果的个数。
operator[]可以更简单的来实现
pair<key,value>
如果key存在就返回value
如果key不存在就先插入key然后返回value
然后我们看这个进一步理解这个到底是怎么做到的
所以[]也可以实现上面的操作而且更加简单。

当然除了上面这一种还可以进行其他的操作

接下来我们来看multimap
multimap与map和multiset与set关系是类似的。
multimap允许key相同的值插入,不相同的也插入。
find,insert,erase,count
void test13() { multimap<string, string> m1 = { {"bird","小鸟"},{"fish","鱼"} , { "snake","蛇" } ,{ "cat","猫" } ,{ "dog","狗" } , { "snack","蛇" } ,{ "snack","零食" } ,{ "snack","零食" } }; for (auto& [x, y] : m1) { cout << x << " " << y << endl; } cout << endl; for (int i = 0; i < 5; i++) { m1.insert({ "cat","猫" }); } for (auto& [x, y] : m1) { cout << x << " " << y << endl; } cout << endl; auto it = m1.find("snack"); m1.erase(it); for (auto& [x, y] : m1) { cout << x << " " << y << endl; } cout << endl; cout << m1.count("cat") << endl; }
更多推荐























































find,insert,erase,count


所有评论(0)