c++:关联容器

  1. 关联容器概述
按关键字有序保存元素
map关联数组:保存关键字-值对
set关键字即值,即只保存关键字的容器
multimap关键字可重复出现的map
multiset关键字可重复出现的set
无序集合
unordered_map用哈希函数组织的map
unordered_set用哈希函数组织的set
unordered_multimap哈希组织map:关键字可以重复出现
unordered_set哈希组织set:关键字可以重复出现

map:map类型通常被称为关联数组。关联数组与正常数组类似,不同之处在于其下表不必是整数。我们通过一个关键字而不是位置来查找值。
set:set必须指定元素类型

int main()
{
 map<string, size_t> word_count;//string到size_t的空map
 set<string> exclude = { "The","But","And","Or","An","A","the","but","and","or","an","a" };
 string word;
 while (cin >> word)
 {
  if (exclude.find(word) == exclude.end())//find返回找到该元素的第一个迭代器,如果找不到则是end()
   ++word_count[word];//提取word的计数器并将其加1
 }
 for (const auto& w : word_count)
  cout << w.first << " occurs " << w.second << ((w.second > 1) ? " times " : " time ") << endl;
 auto map_it = word_count.cbegin();
 while (map_it != word_count.cend())//另一种打印方式
 {
  cout << map_it->first << " occurs " << map_it->second << " times " << endl;
  ++map_it;
 }
}

multimap和multiset:一个map或set中的关键字必须是唯一的,即,对于一个给定的关键字,只能有一个元素的关键字等于它。容器multimap和multiset则没有此限制

int main()
{
 vector<int> ivec;
 for (vector<int>::size_type i = 0; i != 10; ++i)
 {
  ivec.push_back(i);
  ivec.push_back(i);
 }
 set<int> iset(ivec.cbegin(), ivec.cend());
 multiset<int> miset(ivec.cbegin(), ivec.cend());
 cout << ivec.size() << endl;//20
 cout << iset.size() << endl;//10
 cout << miset.size() << endl;//20
}
  1. pair类型
    在头文件utility中

pair:pair是一个用来生成特定类型的模板,当创建一个pair时,我们必须提供两个类型名,pair的数据成员将具有对应的类型,两个类型不要求一样

pair<string,string> anon;
pair<string,size_t> word_count;
pair<string,vector<int>> line;
pair上的操作
pair<T1,T2> p
pair<T1,T2> p(v1,v2)
pair<T1,T2>p = {v1,v2}
make_pair(v1,v2)
p.first
p.second
p1 relop p2
p1 == p2
p1 != p2
pair<string,int>
process(vector<string> &v)
{
	//处理v
	if(!v.empty())
		return {v.back(),v.back().size());
	else
		return pair<string,int>;//隐式构造一个返回值
}
  1. 关联容器操作

map的value_type是一个pair,我们可以改变pair的值,但不能改变关键字成员的值
set中的关键字也是const的,可以用一个set迭代器来读取元素的值,但不能修改

添加元素

word_count.insert({word,1});
word_count.insert(make_pair(word,1));
word_count.insert(pair<string,size_t>(word,1));
word_count.insert(map<string,size_t>::value_type(word,1));

insert的返回值

添加单一元素的insert和emplace版本返回一个pair,告诉我们插入操作是否成功,pair的first成员是一个迭代器,指向具有给定关键字的元素;second成员是一个bool值,指出元素是插入成功还是已经存在于容器中

map<string, size_t> word_count;//从string到size_t的空map
 string word;
 while (cin >> word)
 {
  //插入一个元素,关键字等于word,值为1;
  //若word已在word_count中,insert什么也不做
  auto ret = word_count.insert({ word,1 });
  if (!ret.second)//word已在word_count中
   ++ret.first->second;//递增计数器
  if (word == "end")
   break;
 }

multiset和multimap总会插入一个元素,因此insert操作只返回一个指向新元素的迭代器

删除元素

erase操作接受一个key_type参数,删除所有匹配给定关键字的元素,返回实际删除的元素数量

string removal_word;
cin >> removal_word;
if (word_count.erase(removal_word))
  cout << removal_word;
else
  cout << "not found" << endl;

访问元素

set<int> iset = {0,1,2,3,4,5,6,7,8,9};
iset.find(1);//返回一个迭代器,指向key == 1的元素
iset.find(11);//返回一个迭代器,其值等于iset.end()
iset.count(1);//返回1
iset.count(11);//返回0
在一个关联容器中查找元素的操作
c.find(k)返回一个迭代器,指向第一个关键字为k的元素,若k不在容器中,则返回尾后迭代器
c.count(k)返回关键字等于k的元素的数量。对于不允许重复关键字的容器,返回值永远是0或1
c.lower_bound(k)返回一个迭代器,指向第一个关键字不小于k的元素
c.upper_bound(k)返回一个迭代器,指向第一个关键大于k的元素
c.equal_range(k)返回一个迭代器pair,表示关键字等于k的元素的范围。若k不存在,pair的两个成员均等于c.end()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值