c++关联容器笔记2 有序关联容器的例子

本文介绍了如何使用C++中的std::map数据结构读取规则文件和输入文件,实现单词转换功能。通过`build_map`函数读取规则,`transform`函数执行转换,`word_transform`函数将这些功能结合起来处理两个文件的内容。
摘要由CSDN通过智能技术生成

c++Primer 关联容器单词转换例子

#include <iostream>
#include <set>
#include <vector>
#include <map>
#include <fstream>
#include <sstream>

std::map<std::string, std::string> build_map(std::ifstream& rule_file); // 读取规则文件
const std::string& transform(const std::string& word, const std::map<std::string, std::string>& mp); // 对每一个单词进行转换

// 注意ifstream 对象不支持拷贝 也不能是const & 因为从ifstream中读取文件需要修改到ifstream
void word_transform(std::ifstream& rule, std::ifstream& input)
{
	auto rule_map = build_map(rule);
	std::string line;

	while (std::getline(input, line)) {
		std::istringstream iss(line); // 初始化一个istringsstream对象
		std::string word;
		bool is_first_word = true;
		while (iss >> word) { // 输入流对象遇到空格等空字符会停止本次输入返回 全部输入完后返回false
			if (is_first_word) {
				is_first_word = false;
			}
			else {
				std::cout << " ";
			}
			std::cout << transform(word, rule_map);
		}
		std::cout << std::endl;
	}
}

std::map<std::string, std::string> build_map(std::ifstream& rule_file)
{
	std::string line;
	std::string key;
	std::string value;
	// 输入流对象遇到空格将会停止输入并返回true 此时文件流指针移动到空格处 再用getline从该处一直读到遇到换行
	// eg : "brb be right back" 中key会读进去brb 文件流指针指向第一个空格处 value将会读取到" be right back"
	std::map<std::string, std::string> mp;
	while (rule_file >> key && std::getline(rule_file, value)) {
		// 此时value将以空格开头 要去掉这个空格
		if (value.size() > 1) {
			mp[key] = value.substr(1);
		}
		else {
			std::string err = "no rule for : ";
			throw std::runtime_error(err + key);
		}
	}
	return mp;
}

const std::string& transform(const std::string& word, const std::map<std::string, std::string>& mp)
{
	auto it = mp.find(word);
	if (it != mp.end()) {
		return it->second;
	}
	else {
		return word;
	}
}

int main()
{
	std::ifstream input_file("./input.txt", std::ios::out);
	std::ifstream rule_file("./rule.txt", std::ios::out);
	if (input_file.good() && rule_file.good()) {
		word_transform(rule_file, input_file);
	}
	else {
		std::cout << "read file error" << std::endl;
	}

	return 0;

}

input.txt:
where r u
y dont u send me a pic
k thk l8r

rule.txt:
brb be right back
k okay?
y why
r are
u you
pic picture
thk thanks!
l8r later

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值