- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我一直在解决 Accelerated C++ 练习 8-5,我不想错过本书中的任何一个练习。
Accelerated C++练习8-5如下:
Reimplement the
gen_sentence
andxref
functions from Chapter 7 to use output iterators rather than putting their entire output in one data structure. Test these new versions by writing programs that attach the output iterator directly to the standard output, and by storing the results inlist <string>
andmap<string, vector<int> >
, respectively.
为了理解这个问题的范围和本书这一部分的当前知识——这个练习是关于通用函数模板和迭代器在模板中的使用的章节的一部分。之前的练习是实现 <algorithm>
的简单版本库函数,例如 equal, find, copy, remove_copy_if
等
如果我没理解错,我需要修改xref
函数所以它:
map<string, vector<int> >
中我试图将 map 迭代器作为 back_inserter()
传递, .begin()
, .end()
到这个函数,但无法编译它。回答here解释原因。
第 7 章中的外部参照函数:
// find all the lines that refer to each word in the input
map<string, vector<int> >
xref(istream& in,
vector<string> find_words(const string&) = split)
{
string line;
int line_number = 0;
map<string, vector<int> > ret;
// read the next line
while (getline(in, line)) {
++line_number;
// break the input line into words
vector<string> words = find_words(line);
// remember that each word occurs on the current line
for (vector<string>::const_iterator it = words.begin();
it != words.end(); ++it)
ret[*it].push_back(line_number);
}
return ret;
}
拆分实现:
vector<string> split(const string& s)
{
vector<string> ret;
typedef string::size_type string_size;
string_size i = 0;
// invariant: we have processed characters `['original value of `i', `i)'
while (i != s.size()) {
// ignore leading blanks
// invariant: characters in range `['original `i', current `i)' are all spaces
while (i != s.size() && isspace(s[i]))
++i;
// find end of next word
string_size j = i;
// invariant: none of the characters in range `['original `j', current `j)' is a space
while (j != s.size() && !isspace(s[j]))
++j;
// if we found some nonwhitespace characters
if (i != j) {
// copy from `s' starting at `i' and taking `j' `\-' `i' chars
ret.push_back(s.substr(i, j - i));
i = j;
}
}
return ret;
}
请帮助理解我错过了什么。
最佳答案
我在此处找到了有关该练习的更多详细信息:https://stackoverflow.com/questions/5608092/accelerated-c-exercise-8-5-wording-help :
template <class Out>
void gen_sentence( const Grammar& g, string s, Out& out )USAGE:
std::ostream_iterator<string> out_str (std::cout, " ");
gen_sentence( g, "<sentence>", out_str );
template <class Out, class In>
void xref( In& in, Out& out, vector<string> find_words( const string& ) = split )USAGE:
std::ostream_iterator<string> out_str (std::cout, " ");
xref( cin, out_str, find_url ) ;
坦率地说,我不得不得出这个问题不恰当的结论,特别是在他们为 xref
指定新接口(interface)的地方:xref 应该产生 map 。但是,在这种情况下,使用输出迭代器意味着使用 std::inserter(map, map.end())
。虽然您可以编写代码的编译版本,但这不会达到您的预期,因为 map::insert
将简单地忽略任何具有重复键的插入。
如果外部参照的目标只是将单词链接到它们第一次出现的行号,这仍然可以,但我有一种感觉,练习的作者只是错过了这个微妙的地方点:)
无论如何,这里是代码(请注意,我为 split
发明了一个愚蠢的实现,因为它既缺少又需要):
#include <map>
#include <vector>
#include <iostream>
#include <sstream>
#include <fstream>
#include <algorithm>
#include <iterator>
std::vector<std::string> split(const std::string& str)
{
std::istringstream iss(str);
std::vector<std::string> result;
std::copy(std::istream_iterator<std::string>(iss),
std::istream_iterator<std::string>(),
std::back_inserter(result));
return result;
}
// find all the lines that refer to each word in the input
template <typename OutIt>
OutIt xref(std::istream& in,
OutIt out,
std::vector<std::string> find_words(const std::string&) = split)
{
std::string line;
int line_number = 0;
// read the next line
while (getline(in, line)) {
++line_number;
// break the input line into words
std::vector<std::string> words = find_words(line);
// remember that each word occurs on the current line
for (std::vector<std::string>::const_iterator it = words.begin();
it != words.end(); ++it)
*out++ = std::make_pair(*it, line_number);
}
return out;
}
int main(int argc, const char *argv[])
{
std::map<std::string, int> index;
std::ifstream file("/tmp/test.cpp");
xref(file, std::inserter(index, index.end()));
#if __GXX_EXPERIMENTAL_CXX0X__
for(auto& entry: index)
std::cout << entry.first << " first found on line " << entry.second << std::endl;
#else
for(std::map<std::string, int>::const_iterator it = index.begin();
it != index.end();
++it)
{
std::cout << it->first << " first found on line " << it->second << std::endl;
}
#endif
return 0;
}
关于c++ - Accelerated C++ exercise 8-5 解不清楚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8551922/
有没有更简单的方法是 JavaScript: if (routine !== null && routine.exercises !== undefined && routine.exerci
我希望用数字 1 到 10 填充数组 a,并从该数组中取出一个随机数,将其添加到数组 b 中,然后从数组 a 中删除该元素。我想知道最有效的方法。编辑:(练习要求我在数组中没有重复的值,并且每次调用该
我对 Go 很陌生,对 Go 中的接收器概念很困惑。这是围棋之旅中的练习。 问题正文: Remember the picture generator you wrote earlier? Let's
Write a GraphicsProgram subclass that draws a pyramid consisting of bricks arranged in horizontal ro
我正在运行 exercise monkey 来测试我的 Android 应用程序。作为我的应用程序的一部分,我播放给出单词发音的媒体文件。我已将文件放在 Android 音乐播放器无法读取的目录中。然
到目前为止,我一直在尝试通过在我的项目中立即实现线程来掌握线程。很长一段时间以来,我一直在努力做到这一点。但这并没有产生任何结果,也没有给我任何线程方面的经验。这次尝试给我的唯一印象是 C# 中的线程
我正在阅读 Golang 教程,我对它对 slice 练习中的某些值的作用有点困惑。 https://tour.golang.org/moretypes/18 这是我混淆的代码: 值 0 是完美的蓝色
在练习(或条目?)57 中,我只是不明白逻辑是如何流动的。问题是这样的:给定 (define teacupo (lambda (x) (conde ((= tea x ) #s
我已经开始阅读 Eloquent Javascript,并且有一个关于制作递归函数来检查均匀性的练习。我用几种不同的方法做到了,它很简单,但出于某种原因,我不能再让它与负数一起工作了。我让它工作,然后
我在设置项目框架时遇到问题,因为现在指南要求我使用仅限 Linux 的命令,而我在 Windows 上。在练习 46 中的一行代码之前,本项目的整个指南都没有与 Windows 的兼容性问题。 我能够
我正在从一本名为“Eloquent Javascript”的书中学习 JavaScript 我正在尝试解决此处描述的练习:http://eloquentjavascript.net/04_data.h
练习 7-1。编写一个程序,将大写字母转换为小写字母或将小写字母转换为大写字母,具体取决于在 argv[0] 中找到的调用名称。 对于那些对编写程序感兴趣的人,您可以在此处找到示例解决方案:http:
O OOO OOOOO
我无法获得“艰难学习 Python”练习 13 的额外学分。 它希望我将 argv 与 raw_input 结合起来,但我无法弄清楚。 有人可以帮我吗?例子就太好了! 非常感谢! 编辑:练习的原始代码
这是 C++ Primer 4th Edition 的问题。我正在使用这个版本,因为它是我唯一可以访问的版本。 Question: The Web site (http://www.awprofess
所以我有2个文件,一个是.cpp,另一个是标头。 这是.cpp文件 #include "exercises.h" using namespace std; /* Tema 1 */ /* Exerci
我一直在尝试完成艰难地学习 Python,在练习 48 中,我在运行 nosetests 时继续遇到错误。我正在使用其他人已经在网站上验证过的代码工作,但无论我继续得到这个错误: ==========
这个问题在这里已经有了答案: How do I complete K&R Exercise 2-4? (6 个答案) 关闭 9 年前。 所以这里的练习是设计一个程序,它接受一个字符串并删除该字符串中
你好,我在练习 18 中得到了错误“未定义的方法”,尽管我按照它写的那样做了。 class Exercise18_NamesVariablesCodeFunctions # this one is l
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 5 年前。 Improve t
我是一名优秀的程序员,十分优秀!