Essential C++ 笔记(3):泛型编程风格(下)

本文是Essential C++笔记的第三章泛型编程风格的下篇,主要讲解了如何使用Map(包括插入、查询和遍历)、Set的唯一性特性,以及如何利用Iterator Inserter高效操作容器。还介绍了iostream Iterator在输入输出操作中的应用。下篇将探讨基于对象的编程风格。
摘要由CSDN通过智能技术生成

继续更新Essential C++中第三章:泛型编程风格的后序内容。

7、使用Map

  map被定义为一对数值,key通常是字符串,扮演者索引的角色,另一个数值是value。

#include<map>
#include<string>
map<string, int> words;

  输入key 和 value 的最简单方式是:

words["vermeer"] = 1;

string tword;
while(cin >> tword)
	words[tword]++;

  其中表达式words[toword]可以取出与tword相对应的value。如果tword不在words内,tword便会因此放在words内,并获得默认值0。

  用for循环打印所有单字及其出现的次数:

map<string, int>::iterator it = words.beign();
for(; it != words.end(); it++)
{
	cout << "key:" << it->first << ", value:" << it->second << endl;
}

  查询map内是否存在相应的key的三种方法:

  1. 把key当做索引使用。
int count = 0;
if(!(count = words["vermeer"])) // vermeer并不存在words内

  上述代码的含义是:如果key值存在于words中,返回对应的value值,如果不存在,直接将key值加入map中,相应的value值为0。

  1. 利用map的find()函数,如果key存在,find()函数会返回一个iterator,指向key/value形成一个pair,反之返回end()
int count = 0;
map<string, int>::iterator it;
it = words.find("vermeer");
if(it != words.end())
	count = it->second;
  1. 利用map的count()函数。会返回某特定项在map内的个数:
int count = 0;
string search_word("vermeer");

if(words.count(search_word)) // 如果这个key存在
	count = words[search_word];

  当然,任何key项在map中仅有一个,要想存在多个key值,可使用multimap。

8、使用set

  set是由一组key值组成,所以set中的元素的值是唯一的。

#include<map>
#include<string>
set<string> word_exclusion;
while(cin >> tword)
{
	if(word_exclusion.count(tword))
		continue;
	words[tword]++;
}

  默认情况下,set元素皆依据其所属类型默认的less-than运算符进行排序

9、如何使用 Iterator Inserter

  上述例子中,将源端容器中符合要求的元素赋值给目的端容器,前提是目的端必须得有足够大的容量,这样才能保证iterator迭代器能够在每传来一个元素之后逐一向后移动。

  标准库提供了三个所谓的 insertion adapter让我们避免使用容器的assignment运算符。

  1. back_inserter()会以容器的push_back()取代assignment的作用:
vector<int> result_vec;
unique_copy(ivec.begin(), ivec.end(), back_inserter(result_vec));
  1. inserter()会以容器的insert()函数取代assignment运算符。inserter()会接收两个参数:容器、iterator:
vector<int> svec_res;
unique_copy(svec.beign(), svec.end(), inserter(svec_res, svec_res.end()));
  1. front_inserter()会以容器的push_front()函数取代assignment运算符。只适应于list 和 deque。

  最后对上述功能进行一个总体的实现:

#include<iterator>
int main()
{
	const int elem_size = 8;

	int ia[elem_size] = {12, 8, 43, 0, 6, 21, 3, 7};
	ector<int> ivec(ia, ia + elem_size);
		
	int ia2[elem_size];
	vector<int> ivec2;
	
	cout << "在ia数组中找到小于8的整数:" << endl;
	filter(ia, ia + elem_size, ia2, elem_size, less<int>() );

	cout << "在ivec数组中找到大于8的整数:" << endl;
	filter(ivec.begin(), ivec.end(), back_inserter(ivec2), elem_size, greater<int>() ); // ivec2执行插入操作
}

10、使用iostream Iterator

  标准库定义了有供输入输出使用的 iostream iterator类,称为istream_iteratorostream_iterator,分别支持单一类型的元素读取和写入。直接上案例:

#include<iostream>
#include<fstream>
#include<iterator>
#include<algorithm>
#include<vector>
#include<string>

int main()
{
	ifstream in_file("input_file.txt");
	ofstream out_file("out_file.txt");
	
	if(! in_file || ! out_file)
	{
		cerr << "不能够打开这些文件" <<endl;
		return -1;
	}
	
	istream_iterator<string> is(in_file);
	istream_iterator<stirng> eof;

	vector<string> text;
	copy(is, eof, back_inserter(text));
	
	sort(text.begin(), text.end());

	ostream_iterator<string> os(out_file, " ");
	copy(text.begin(), text.end(), os);
}

  泛型编程暂时更新到这里,本系列的下篇博文便是基于对象的编程风格,to be contiuned…
在这里插入图片描述

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值