zoukankan      html  css  js  c++  java
  • C++Primer第五版 第十一章 关联容器

    习题首页

    11.1 使用关联容器

    知识点1:关联容器与顺序容器有着本质的区别,关联容器中的元素是按关键字来保持和访问的。

    知识点2:与之相反,顺序容器中的元素是按它们在容器中的位置来顺序保持和访问的。

    知识点3:关键词在关联容器中起到重要的作用,map中的元素是(关键字—值)对,关键词是索引左右,值是与索引相关联的数据。set每个元素只包含一个关键字,支持高效的关键词查找。

    练习11.1

    对于vector这样的顺序容器,元素在其中按照顺序存储,每个元素有唯一对应的位置编号,所有操作都是按编号(位置)进行的。例如,获取元素(头,尾,用下标获取任意位置),插入删除元素(头,尾,任意位置),遍历元素(按元素位置顺序逐一访问)。底层的数据结构是数组,链表,简单但已能保证上述操作的高效。而对于依赖值的元素访问,例如查找(搜索)给定值(find),在这种数据结构上的实现是要通过遍历完成,效率不佳。

    而map这种关联容器,就是为了高效实现“按值访问元素”, 这类操作而设计的。为了达到这一目的,容器中的元素是按照关键字值储存的,关键字值与元素数据建立起对应关系,这就是“关联”的含义。底层数据结构是红黑树,哈希表等,可高效实现按关键字值查找,添加,删除元素等操作。

    练习11.2

    map:存储字典型数据

    set:坏值检验,只有关键字的好处

    list:任意位置任意删除添加数据

    deque:信息处理,只在头部

    vector:相关联数据,顺序处理

    练习11.3

    #include <iostream>
    #include <fstream>
    #include <string>
    #include <vector>
    #include <sstream>
    #include <list>
    #include <deque>
    #include <forward_list>
    #include <algorithm>
    #include<numeric>
    #include<map>
    #include<set>
    using namespace std;
    
    int main(int argc,char **argv) {
    
    	
    	map<string, size_t> word_count;
    	string word;
    	while (cin >> word){
    		++word_count[word];
    	}
    	for (const auto &w : word_count){
    		cout << w.first << "occurs" << w.second << ((w.second > 1) ? "times" : "time") << endl;
    	}
    	system("pause");
    	return 0;
    }
    

    练习11.4

    知识点1:头文件:#inlude <cctype.h>,ispunct() 函数用来检测一个字符是否为标点符号或特殊字符,其原型为:int ispunct(int c);

    知识点2:目前在头文件iostream中也可以使用,C++ 5.11已证明。把字符转换成小写字母,非字母字符不做出处理用 法: int tolower(int c);

    #include<iostream>
    #include<string>
    #include<map>
    #include<cctype>  /ctype无法打开,包含tolower()函数和ispunct函数
    using namespace std;
    
    void process(string &s) {
    	for (auto i = 0;i < s.size(); ++i) {
    		if (isupper(s[i])) s[i] = tolower(s[i]);
    		else if (ispunct(s[i])) {
    			s.erase(i,1);
    		}
    	}
    }
    
    int main() {
    	string s;
    	map<string, size_t> num;
    	cout << "输入单词表:" << endl;
    	while (cin >> s) {
    		process(s);
    		++num[s];
    	}
    	for (const auto &i : num) {
    		cout << i.first << " occurs " << i.second << ((i.second > 1) ? " times" : " time") << endl;
    	}
    
    	system("pause");
    	return 0;
    }
    

    11.2 关联容器的概述

    知识点1:关联容器不支持顺序容器的位置相关操作,如push_back等等。

    知识点2:关联容器的迭代器都是双向的,还有一些关于哈希性能的操作

    知识点3:multimap和multiset允许多个元素具有相同的关键字,所以给multiset和multimap中传入相同的元素,是可行的,而set、map会忽略相同关键字的元素

    练习11.5

    map和set都是stl中的关联容器,map以键值对的形式存储,key=value组成pair,是一组映射关系。

    set只有值,可以认为只有一个数据,并且set中元素不可以重复且自动排序,如果需要重复则使用multiset。

    练习11.6

    set不可以重复,且自动排序。

    练习11.7

    #include<map>
    #include<vector>
    #include<iostream>
    #include<string>
    
    using namespace std;
    
    int main() {
    	map<string, vector<string>> mp;
    	string last_name, first_name;
    	cout << "输入姓:" << endl;
    	cin >> last_name;
    	cout << "输入该姓的成员名字:" << endl;
    	while (cin >> first_name) {
    		mp[last_name].push_back(first_name);
    	}
    	for (const auto i : mp) {
    		cout << "姓:" << i.first << " 有以下成员:" << endl;
    		for (const auto j : i.second) {
    			cout << j << " ";
    		}
    		cout << endl;
    	}
    
    	system("pause");
    	return 0;
    }
    

    练习11.8

    set会自动忽略重复的关键字

    #include<vector>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    
    int main() {
    	vector<int> v = { 1,1,2,3,4,4,5,6 };
    	auto iter = unique(v.begin(), v.end());
    	v.erase(iter, v.end());
    	for (auto i : v) {
    		cout << i << " ";
    	}
    	cout << endl;
    	system("pause");
    	return 0;
    }
    

    以后补剩下的。

  • 相关阅读:
    多线程访问成员变量与局部变量
    Could not resolve placeholder 解决方案
    instanceof, isinstance,isAssignableFrom的区别
    YYYY-mm-dd HH:MM:SS
    整合Spring Data JPA与Spring MVC: 分页和排序
    dubbo配置文件xml校验报错
    安装eclipse插件时出现问题
    Windows上搭建hadoop开发环境
    jquery validate 在ajax提交表单下的验证方法
    HDU 1698 Just a Hook(线段树区间替换)
  • 原文地址:https://www.cnblogs.com/wsl540/p/13426112.html
Copyright © 2011-2022 走看看