- 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/
我试图包含我在Github(DOUAudioStreamer)上找到的MP3阅读器,首先当我在模拟器上进行测试时,所有内容都像魅力一样工作,但是当我尝试将此项目构建到iPhone 5中时,出现了文件错
是否有混合加速器允许我在同一个 Web 角色中将 Umbraco 和普通 MVC3 项目混合在一起? 因此,如果我运行 6 个站点,其中 3 个是 Umbraco,3 个只是 MVC 项目,是否有一个
我想在 SYMFONY 3.0 项目中将 PHP5.5 升级到 7.1。 我一直在检查“php.ini”文件以获得正确的结果。 最后一件事没有解决:在PHP5.5下,我使用了扩展加速器php_apcu
我在 MySQL 数据库中有一个带字幕(和相应时间戳)的视频。有时视频和字幕上的时间戳同步,有时不同步。 问题是视频中的偏移量不一致(即差异在整个视频中都在增加,因此使用简单的 UPDATE 不起作用
每个关于加速器的教程都教授如何从代码中使用它们,而不是从 fxml 文件中使用它们。在那里,您将了解如何使用预定义的 KeyCombinations 来实现平台独立性。 现在我想知道,如果我在 fxm
我正在尝试确定 Accelerate Framework 是否可以帮助加快我的应用程序必须执行的计算。假设我有以下数组: invoice[0..n],包含发票值的 double 组 week[0..n
在我的 iOS 代码中,我有一个矩阵 (float *) 变量,如下所示: [ 1 2 3 4 5 6 7 8 9 0 1 2 ] 我需要构建一个矩阵,其中所有元素的 1 等于某个值(例如 2
我想知道是否可以用 css 实现“加速,然后滑行”动画,就像这个 3D.js example 基本上,一个物体从 0 开始并加速运动直到某个点,然后保持恒定速度。 我认为这可以通过将旋转动画应用到同一
我正在开发一个使用 Accelerate 框架(用于 LAPACK)的程序,但我遇到了几个问题。代码是用 C 语言编写的,但需要包含 C++ header 。我将文件重命名为 .cpp,但它导致了两个
标题是这里的主要问题。我有一些在我的计算机上运行的 PyOpenGL 代码,运行速度有点慢。我意识到我没有安装 PyOpenGL-accelerate。这根本没有改变速度,但大多数使用 Python
我遇到了和这个问题一样的问题。 Paypal Express Checkout with ActiveMerchant as in Shopify 我想暗示 shopify 就像 paypal 付款一
我有一个用 C 语言编写的函数来计算特征值和特征向量,但它需要大量的 CPU 时间,因为我在另一个算法中多次调用这个函数。根据苹果 Accelerate framework可用于使用 BLAS 和 L
是的,我知道使用 CIAreaAverate CIFilter获取像素的平均颜色。 我正在尝试使用 Accelerate Framework 创建一些替代方案看看我能不能更快地带来一些东西。 我正在渲
我们目前正在使用 Java2D API 开发一款 Java 游戏,在 Ubuntu 环境中运行时遇到了一些奇怪的性能问题。 我们的帧速率从 Windows 和 Mac 系统上的平均 62fps 下降到
我正在查看 Accelerate 以计算 Swift 中数组的均值和标准差。 我能做到。我如何计算标准偏差? let rr: [Double] = [ 18.0, 21.0, 41.0, 42.0,
我看到它主要用于引用动画和其他视觉效果。花哨的 CSS3 东西,flash 视频播放,诸如此类。我不知道我是否见过它在与网络浏览器没有任何关系时被使用过,尽管这可能只是我没有阅读任何与网络开发无关的技
假设我有一个 Bezier curve B(u) ,如果我增加 u参数以恒定速率我没有获得沿曲线的恒定速度运动,因为 u 之间的关系参数和评估曲线所获得的点不是线性的。 我已经阅读并实现了 David
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 4 年前。 Improve this ques
我有一些关于 Accelerate 框架的问题。 单精度浮点型、单精度复合型、 double 浮点型和 double 复合型之间有什么区别?对于像这样的简单结构我应该使用什么: struct vect
有谁知道在 Accelerate (CLAPACK) 中使用什么函数/方法来求解如下所示的增广矩阵?寻找任何示例代码、示例链接、有关如何求解矩阵的提示。我一直在浏览文档,但大多数事情都与更复杂的图形系
我是一名优秀的程序员,十分优秀!