C++第十四天 关联容器

 
	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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值