带你详细了解C++中的map(键值对)和set(集合)
C++学习:map集合(键值对)
集合(set)与映射(map)属于非线性结构容器类
内部实现上面是平衡二叉树
map是STL的一个关联性容器,它提供一对一的数据处理能力
其中第一个可以称为关键字,每个关键字只能在map中出现一次
第二个称为该关键字的值
###set集合
begin 语法:
ITerator begin();
返回指向当前集合中第一个元素的迭代器。
clear 语法:
void clear();
清除当前集合中的所有元素。
count 语法:
size_tyPE count( const key_type & key );
返回当前集合中出现的某个值的元素的数目。
empty 语法:
bool empty();
如果当前集合为空,返回true;否则返回false。
end 语法:
const_iterator end();
返回指向当前集合中最后一个元素的迭代器。
equal_range 语法:
pair equal_range( const key_type & key );
返回集合中与给定值相等的上下限的两个迭代器。
erase 语法:
void erase( iterator i ); void erase( iterator start, iterator end ); size_type erase( const key_type & key );
说明:
● 删除i元素;
● 删除从start开始到end结束的元素;
● 删除等于key值的所有元素(返回被删除的元素的个数)。
find 语法:
iterator find( const key_type & key );
在当前集合中查找等于key值的元素,并返回指向该元素的迭代器;如果没有找到,返回指向集合最后一个元素的迭代器。
get_allocator 语法:
allocator_type get_allocator();
返回当前集合的分配器。
insert 语法:
iterator insert( iterator i, const TYPE & val ); void insert( input_iterator start, input_iterator end ); pair insert( const TYPE & val );
说明:
● 在迭代器i前插入val;
● 将迭代器start开始到end结束返回内的元素插入到集合中;
● 在当前集合中插入val元素,并返回指向该元素的迭代器和一个布尔值来说明val是否成功的被插入了。
(应该注意的是在集合(Sets)中不能插入两个相同的元素。)
lower_bound 语法:
iterator lower_bound( const key_type & key );
返回一个指向大于或者等于key值的第一个元素的迭代器。
key_comp 语法:
key_compare key_comp();
返回一个用于元素间值比较的函数对象。
max_size 语法:
size_type max_size();
返回当前集合能容纳元素的最大限值。
rbegin 语法:
reverse_iterator rbegin();
返回指向当前集合中最后一个元素的反向迭代器。
rend 语法:
reverse_iterator rend();
返回指向集合中第一个元素的反向迭代器。
size 语法:
size_type size();
返回当前集合中元素的数目。
swap 语法:
void swap( set & object );
交换当前集合和object集合中的元素。
upper_bound 语法:
iterator upper_bound( const key_type & key );
在当前集合中返回一个指向大于Key值的元素的迭代器。
value_comp 语法:
value_compare value_comp();
返回一个用于比较元素间的值的函数对象
简单的示例代码:
/* * =========================================================================== * * Filename: settest.cpp * Description: * Version: 1.0 * Created: 2017年07月01日 22时20分58秒 * Revision: none * Compiler: gcc * Author: (), * Company: * * =========================================================================== */#includeiostream> #includeset> using namespace::std; void showSet(const setint> i_set){ //通过迭代器的形式输出set集合 cout"===========the show start==========="endl; setint> ::const_iterator c_iter; for(c_iter = i_set.begin(); c_iter !=i_set.end(); c_iter++){ cout "i_set:"*c_iter endl; } cout"===========the show end============="endl; } void showReverseSet(setint> r_set){ cout"==========the show reverse set start============="endl; //通过反向迭代器输出 setint> ::reverse_iterator r_iter; for(r_iter = r_set.rbegin(); r_iter!=r_set.rend(); r_iter++){ cout "r_set:" *r_iter endl; } cout"==========the show reverse set end==============="endl; } int main(int argc,char *argv[]){ //set的常用几种构造函数 int array[6] = { 11,3,25,7,9,6} ; //第一种构造函数 setint> First_set; //第二种构造函数 setint> second_set(array,array+6); showSet(second_set); //第三种构造函数 setint> third_set(second_set.begin(),second_set.end()); showSet(third_set); //set的插入insert函数 first_set.insert(3); first_set.insert(6); first_set.insert(5); first_set.insert(5); showSet(first_set); //返回当前集合中出现某个值的数量count int count = first_set.count(5); cout "the count:" count endl; //返回当前集合是否是null的 empty函数 bool setISEMpty = first_set.empty(); cout "the set empty type:"setIsEmpty endl; //删除某个元素 erase first_set.erase(3); showSet(first_set); //set的大小 cout"the set Size:" first_set.size() endl; showReverseSet(first_set); //交换集合中的元素 first_set.swap(second_set); showSet(first_set); showSet(second_set); //通过find函数来寻找集合中的元素 setint> ::iterator iter; iter = first_set.find(3); first_set.erase(iter); showSet(first_set); first_set.clear(); return 0; }
###map键值对的使用
C++ Maps
C++ Maps 被用作储存“关键字/值”对
begin 语法:
iterator begin();
begin()函数返回一个迭代器指向map的第一个元素。
clear 语法:
void clear();
clear()函数删除map中的所有元素。
count 语法:
size_type count( const KEY_TYPE & key );
count()函数返回map中键值等于key的元素的个数。
empty 语法:
bool empty();
empty()函数返回真(true)如果map为空,否则返回假(false)。
end 语法:
iterator end();
end()函数返回一个迭代器指向map的尾部。
equal_range Syntax:
pair equal_range( const KEY_TYPE & key );
equal_range()函数返回两个迭代器——一个指向第一个键值为key的元素,另一个指向最后一个键值为key的元素。
erase 语法:
void erase( iterator pos ); void erase( iterator start, iterator end ); size_type erase( const KEY_TYPE & key );
erase()函数删除在Pos位置的元素,或者删除在start和end之间的元素,或者删除那些值为key的所有元素。
find 语法:
iterator find( const KEY_TYPE & key );
find()函数返回一个迭代器指向键值为key的元素,如果没找到就返回指向map尾部的迭代器。
get_allocator 语法:
allocator_type get_allocator();
get_allocator()函数返回map的配置器。
insert 语法:
iterator insert( iterator pos, const pairKEY_TYPE,VALUE_TYPE> & val ); void insert( input_iterator start, input_iterator end ); pairiterator, bool> insert( const pairKEY_TYPE,VALUE_TYPE> & val );
insert()函数:
插入val到pos的后面,然后返回一个指向这个元素的迭代器。
插入start到end的元素到map中。
只有在val不存在时插入val。返回值是一个指向被插入元素的迭代器和一个描述是否插入的bool值。
key_comp 语法:
key_compare key_comp();
key_comp()函数返回一个比较key的函数。
lower_bound 语法:
iterator lower_bound( const KEY_TYPE & key );
lower_bound()函数返回一个迭代器,指向map中键值> =key的第一个元素。
max_size 语法:
size_type max_size();
max_size()函数返回map能够保存的最大元素个数。
rbegin 语法:
reverse_iterator rbegin();
rbegin()函数返回一个指向map尾部的逆向迭代器。
rend 语法:
reverse_iterator rend();
rend()函数返回一个指向map头部的逆向迭代器。
size 语法:
size_type size();
size()函数返回map中保存的元素个数。
swap 语法:
void swap( map & obj );
swap()交换obj和现map中的元素。
upper_bound 语法:
iterator upper_bound( const KEY_TYPE & key );
upper_bound()函数返回一个迭代器,指向map中键值> key的第一个元素。
value_comp 语法:
value_compare value_comp();
value_comp()函数返回一个比较元素value的函数。
map集合的一些简单的使用
#includeiostream> #includemap> #includestring> using namespace::std; /* * *map集合的简单使用 * * */class Compare{ public: bool operator()(int a,int b){ return a > b; } } ; int main(int argc,char* argv[]){ //定义一个map的对象 mapint,string> num_convert_map; mapint,string> ::iterator m_iter; //采用pair来进行键值对的添加 num_convert_map.insert(pairint,string> (1,"one")); //通过map集合内部的value_type来进行插入键值对 num_convert_map.insert(mapint,string> ::value_type(2,"two")); //通过make_pair来进行键值对的插入 num_convert_map.insert(make_pair(3,"three")); //map重载了[],[键] = "值" num_convert_map[0] = "zero"; //输出map中的元素 for(m_iter =num_convert_map.begin(); m_iter != num_convert_map.end() ; m_iter++){ //第一个元素iter-> first 第二个元素 iter-> second cout m_iter-> first ":" m_iter -> second endl; } //通过键来查询值 coutnum_convert_map[3]endl; mapstring,string> string_map; string_map.insert(pairstring,string> ("张三","初中")); string_map["李四"] = "高中"; //由此重写后的map对象的[]运算符是支持泛型的 cout string_map["张三"]endl; //输出map的大小 cout "map size:" num_convert_map.size() endl; //通过Compare将map排序,通过赋值拷贝的构造函数 mapint,string,Compare> num_convert_map2(num_convert_map.begin(),num_convert_map.end()); num_convert_map2.insert(pairint,string> (5,"张三")); num_convert_map2.insert(pairint,string> (3,"李四")); num_convert_map2.insert(pairint,string> (1,"赵柳")); cout "-------------"endl; for(m_iter = num_convert_map2.begin(); m_iter != num_convert_map2.end(); m_iter++){ coutm_iter-> first "; "m_iter-> secondendl; } return 0; }
感谢大家的阅读,希望大家收益多多。
本文转自: https://blog.csdn.net/QQ_29924041/article/details/74080102
推荐教程:《c语言》
以上就是带你详细了解C++中的map(键值对)和set(集合)的详细内容,更多请关注其它相关文章!
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: 带你详细了解C++中的map(键值对)和set(集合)
本文地址: https://pptw.com/jishu/594531.html