- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我必须使用无法更改的外部库。除其他外,该库可以通过其内部逻辑对特殊格式的文件进行标记。 tokenizer 提供了一个迭代器接口(interface)来访问 token ,它看起来像下面的简化示例:
class Tokenizer {
public:
/* ... */
Token token() const; // returns the current token
Token next() const; // returns the next token
bool hasNext() const; // returns 'true' if there are more tokens
/* ... */
};
我想为呈现的 Tokenizer
实现一个迭代器包装器,它允许使用标准 algorithms library (std::copy_if
、std::count
等)。更具体地说,如果迭代器包装器满足 input iterator 的要求就足够了.
我当前的试用版如下所示:
class TokenIterator {
public:
using iterator_category = std::input_iterator_tag;
using value_type = Token;
using difference_type = std::ptrdiff_t;
using pointer = const value_type*;
using reference = const value_type&;
explicit TokenIterator(Tokenizer& tokenizer) :
tokenizer(tokenizer) {
}
TokenIterator& operator++() {
tokenizer.next();
return *this;
}
value_type operator*() {
return tokenizer.token();
}
private:
Tokenizer& tokenizer;
};
我被 begin
和 end
、相等比较器等函数的实现所困。所以,我的问题是:
TokenIterator
实例来指示 token 序列的结尾(即 hasNext() == false
)以及如何将它与另一个 进行比较code>TokenIterator
实例判断是否相同?operator*()
的重载中返回一个值而不是引用,这是一个好方法吗?最佳答案
首先,我建议仔细查看 http://www.boost.org/doc/libs/1_65_1/libs/iterator/doc/iterator_facade.html
我发现它大大减少了此类代码所需的样板文件数量。
然后,您必须决定希望如何表示已到达“结尾”的迭代器。一种方法是使默认构造的迭代器成为“结束”迭代器。它不包含任何对象,您不能递增或取消引用它。“开始”迭代器是一个非默认构造的迭代器。它有一个对象,您可以取消引用它。递增此迭代器只需检查 hasNext()
。如果为真,则将包含的对象设置为 next()
。如果为 false,则清除包含的对象并使此迭代器看起来像默认构造的迭代器。
operator*
按值返回应该没有任何问题。即使您分配给引用,生命周期延长也会保留该值,直到引用超出范围。也就是说,任何假定此类引用在多次迭代后仍然有效的代码都会中断,因此请坚持使用简单的 for (auto val : tokens)
或 for (auto& val : tokens)
.
关于c++ - 将next()、hasNext()迭代器接口(interface)转为begin()、end()接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47403058/
我使用 POI4XPages api 从 Word 文档创建了 PDF。这是代码: var template = poiBean.buildResourceTemplateSource(null,"p
我如何转换它: SELECT max(id), value FROM GROUP BY value; 能言善辩吗? 提前致谢!! 最佳答案 这应该可行,您可以在 https://laravel.co
我有Jquery点击事件,并且我想在执行我的函数UpdateItemStatus(this.id);之前防止多次点击,所以我已尝试使用开/关事件的以下代码, $('#tableItems').on('
有谁知道有什么软件包支持以下将base58转换为十六进制字符串或从十六进制字符串转换为base58编码的相反方式。下面是一个 python 实现的示例。 https://www.reddit.com/
我正在使用 Rob Monies 的“Jquery Week Calendar”来构建日历应用程序。 我有一个 MSSQL 数据库,其中包含名为“dates”的表和以下字段: ID开始结尾标题 我想用
我有一个以下形式的字典 >>> {'1' : [V3210 , 234567 ,1235675 , 23], '2' : [v3214 , 5678 ,65879 ,89} , ...} 如何将字典写
我有一堆 one 形式的变量, two , three , four_five我想把它们转到getOne , getTwo , getThree , getFourFive ... 我写了一个公式来实
这是我的第一个问题,我是初学者,代码是用 C (ANSI C) 编写的。 代码应该为递归函数中的每个数字返回数字 (n+1)。(123 -> 234; 801->912; 239->340) 问题是当
这可能是一个愚蠢的问题,但是我很难找到我需要的答案。我有一个计算中继器的测试。我想返回 count 变量,以便我可以将其传递给另一个测试以在 for 循环中使用。 我尝试过的: this.counts
我有这个字符串列表: private final List categoryList = Arrays.asList("27", "28, 96", "10", "15", "7", "98"); 从
我正在使用互操作将 excel 文件转换为 pdf。我有一个工作代码。 但在将其保存为 pdf 之前。它会提示一个对话框,要求用户“是否保存对文件的更改”我怎样才能避免这个提示? 保存完成后如何关闭e
我有一个 Canvas ,我想将其转换并显示在标签中。我知道我们可以使用 toDataURL() 和 toBlob() 将 Canvas 转换为图像,但这两种方法都给我 base64 数据,这不是图像
我有一个获取用户 profilePicture、lblUsername 和 lblEmail 的 Facebook 登录名。我知道 FBProfilePictureView 是一个包含 UIImage
我正在尝试使用 grunt-webfont 从 SVG 生成网络字体. 问题是我需要这个任务在 windows 和 linux 机器上有效。为了实现这一点,我需要使用 doesn’t work wit
我使用的是我在 GitHub 上发现的一个 JS 插件,它使视频标题出现视差,问题是当我运行它响应手机时视频变黑,我试图在响应模式下将视频更改为图像。 我尝试使用@mediatag 但无法正常工作。
我正在尝试学习 Go 并研究降雨强度工具。对于此工具,我必须进行如下计算: var intensity float32 intensity = 10^((value−109)÷32) 值是一个 uin
我有一个看起来像这样的字符串,例如 Lübeck Nürnberg Österreich 和“Umlaute”。 现在我想拆分它并在字符串上添加新的“单词”,如下所示Lübeck Nürnberg Ö
我的任务: 通过 ffmpeg 将 YUV Frame 数据转换为 jpeg 图像。 我有的: 每个平面的数据和每个平面的线尺寸; 我试图创建空的 AVFrame 并用这些信息填充它的数据和行大小,但
使用 Reflex-DOM,我想做一个 Event t ()当浏览器准备好绘制下一帧时触发,即 requestAnimationFrame火灾。我试过这样: {-# LANGUAGE Recursiv
我有一条路线 Route::post('/updateLogo', 'CaptivePortalController@updateLogo'); 然后我在这里发布 $http({ method
我是一名优秀的程序员,十分优秀!