pair类型:
pair类型就是一个key-value对,该类型就存储两个值,分别是v1、v2
关联容器:
支持通过键来高效地查找和读取元素的容器,其实就是类似map的数据结构
map类型:
在使用关联容器时,它的键不但有一个类型,而且还有一个相关的比较函数,默认情况下,标准库使用键类型定义的<操作符来实现键的比较(与Java的键必须实现comparaTo/Comparator比较方法一样)。
在实际应用中,键类型必须定义<操作符,而且该操作符应能“正确地工作”这很重要。
map迭代器进行解引用将产生pair类型的对象。(其中键为const对象,不可修改,值可以修改。)
map迭代器返回的是value_type类型的值(包含const key_type和mapped_type类型成员的pair对象),下标操作符则返回一个mapped_type类型的值。
map类型中的insert函数中,如果形参是一个键-值pair类型,则该insert函数返回一个pair值,该pair值包含(一个迭代器和一个bool值),例如;
map<string,int> word_count;
string word;
while(cin>>word){
//返回一个pair类型的值,该类型包含一个指向插入元素值的迭代器和一个bool值
//成功插入则迭代器指向插入的值,bool为true,如果map中已存在键-值对,则插入失败,迭代器指向键-值对,bool为false
pair<map<string,int>::iterator,bool> ret=word_count.insert(make_pair(word,1));
if(!ret.second)
++ret.first->second;
}
set容器:
set不支持下标操作。set和map一样,存储的键必须是唯一的,而且不能修改,map存储key-value对,则set值存储键值。
支持一对多的关联容器:multimap和multiset
#include<iostream>
#include<map>
#include<set>
#include<string>
#include<vector>
using std::set;
using std::vector;
using std::cout;
using std::string;
using std::cin;
using std::endl;
using std::map;
int main(){
/*
//定义三个字符串数组
string key[]={"'em","cuz","gratz","i","nah","pos","sez","tanx","wuz"};
string value[]={"them","because","grateful","I","no","supposed","said","thanks","was"};
string result[]={"nah","i","sez","tanx","cuz","i","wuz","pos","to","not","cuz","i","wuz","gratz"};
map<string,string> str_map;
//装载到map容器
for(string::size_type i=0;i!=sizeof(key)/sizeof(string);i++){
str_map.insert(std::make_pair(key[i],value[i]));
}
//根据result数组输出内容
for(string::size_type j=0;j!=sizeof(result)/sizeof(string);j++){
// map<string,string>::const_iterator tmp=str_map.find(result[j]);
//
if(str_map.count(result[j])){
cout<<str_map[result[j]]<<" ";
}
else{
cout<<result[j]<<" ";
}
}
cout<<endl;
*/
vector<int> ivec;
for(std::vector<int>::size_type i=0;i!=10;++i){
ivec.push_back(i);
ivec.push_back(i);
}
//建立set集合对象,并初始化
set<int> iset(ivec.begin(),ivec.end());
//ivec对象的长度为20,有重复元素
cout<<ivec.size()<<endl;
//iset对象的长度为10,没有重复元素
cout<<iset.size()<<endl;
//尝试修改set中的值
std::set<int>::iterator set_it=iset.find(1);
//在vc++中居然能修改它的值,这是为什么呢?
*set_it=11;
cout<<*set_it<<endl;
return 0;
}
C++第十四天 关联容器
最新推荐文章于 2025-05-21 19:46:45 发布