草庐IT

ITERATOR

全部标签

c++ - 如何将 boost::spirit::lex token 的值从 iterator_range 转换为字符串?

当我尝试从iterator_range转换标记的值时,词法分析器在尝试读取下一个标记时失败。这是包含token定义的token结构:(我不认为这是相关的,但我包括以防万一。)templatestructTokens:boost::spirit::lex::lexer{Tokens();boost::spirit::lex::token_defidentifier;boost::spirit::lex::token_defstring;boost::spirit::lex::token_defboolean;boost::spirit::lex::token_defreal;boost:

C++11 Lambda 和模板导致奇怪的链接器行为

在我的代码中,我得到了包含依赖于某些模板参数的lambda表达式的函数模板。最近我遇到了链接器错误,可能是因为我的g++编译器更新了,但不幸的是,我不知Prop体情况。我将举一个小例子来说明这个问题。因为这是一个链接器问题,我们必须创建几个文件来演示它。我们有common.hpp,里面包含一个通用模板函数,两个模块a.cpp/a.hpp和b.cpp/b.hpp使用该函数和一个包含main函数的main.cpp模块。//common.hpp#includetemplatevoidmy_transform(Iteratorbegin,Iteratorend){std::transform(

c++ - 函数模板只接受双向迭代器或指针

我需要一个函数模板来接受两个可以是指针的迭代器。如果这两个参数是random_access迭代器,我希望返回类型是的对象std::iterator输入否则std::iterator类型。我也想让代码拒绝如果参数既不是双向迭代器也不是指针,则进行编译。我不能依赖第三方库,例如提升你能帮我解决这个函数的签名问题,让它接受双向迭代器和指针,但不能说是input_iterator、output_iterator、forward_iterators。我能想到的部分解决方案如下templateTfoo(Titer1,Titer2){constTtmp1=reverse_iterator(iter1

c++ - vector < vector < int >> 在第一个维度上的点积

我有vector>data_mat(3,vector(4));vectordata_vec(3);哪里data_mat可以被认为是一个矩阵和data_vec作为列vector,我正在寻找一种方法来计算data_mat的每一列的内积与data_vec,并将其存储在另一个vectordata_out(4)中.例子http://liveworkspace.org/code/2bW3X5%241使用for_each和transform,可用于计算矩阵的列和:sum=vector(data_mat[0].size());for_each(data_mat.begin(),data_mat.end

c++ - 可以将原始指针传递给需要迭代器的模板函数吗?

能否将原始指针传递给需要迭代器的模板函数?我是否认为迭代器只是一个覆盖指针相关运算符(例如*、++等)的类,或者迭代器是否公开了指针不公开的任何其他接口(interface)?换句话说,指针“看起来像”迭代器吗?例子:我想使用boost::algorithm::knuth_morris_pratt_search(documentationhere)。我的语料库(要搜索的字符串)和模式(要查找的字符串)只是内存中的字节-我有一个包含起始地址和字节长度的指针。为了论证,假设它是一个C风格的字符串。根据文档,knuth_morris_pratt_search函数要求我为语料库和模式传入开始和

c++ - 删除时 std::list end() 迭代器位置是否改变?

在下面的循环中,我使用了一个预先计算好的结束迭代器:std::list::iteratorend=MyList.end();for(std::list::iteratorit=MyList.begin();it!=end;)it=MyList.erase(it);当删除std::list中的元素时,MyList.end()是否可以更改其值以便end!=MyList.end()不再存在? 最佳答案 没有。n337623.3.5.4iteratorerase(const_iteratorposition);iteratorerase(c

c++ - 为什么不在带有迭代器参数的标准库函数中提供重载?

这个问题在这里已经有了答案:whynosort(v)inC++?(6个答案)关闭8年前。标准库中有很多函数的结构如下:std::foo(begin(x),end(x),bar);令我困扰的是,99%的时间里,参数都是开始和结束。为什么这些函数不都具有肯定会更频繁使用的重载,例如:std::foo(x,bar);这是语言或设计限制还是疏忽?谢谢。

c++ - 如何使用 SFINAE 限制输入迭代器的重载

许多容器类模板有一个以计数和样本元素作为参数的构造函数,以及另一个以一对输入迭代器为参数的构造函数。insert等其他方法表现出相同的模式。当模板用整数类型实例化时,天真的实现会遇到麻烦,并且用一对整数调用构造函数(或其他方法):它们的类型相等,输入迭代器方法将给出有效的参数类型推导,但随后无法编译。我正在寻找一种优雅的方式来指定输入迭代器方法仅参与实际有效输入迭代器类型的(相等)参数类型的重载,或者至少不参与整数类型。我的印象是SFINAE是要走的路(但很高兴被告知不同),但是在阅读它时,坦率地说我不太了解规则,而且示例中提供的解决方案很难算得上优雅.作为附带限制,我希望我的代码能够

c++ - 编译器优化打破了惰性迭代器

我用自定义迭代器编写了一个自定义容器。由于容器的特殊特性,必须延迟计算迭代器。为了这个问题,代码的相关部分是以这种方式实现的迭代器的取消引用运算符templatestructContainer{vectorm_Inner;//Thisshouldcalculatetheappropriatevalue.//Inthisexampleistakenfromavecbutin//therealuse-caseiscalculatedonrequestTValue(intN){m_Inner.at(N);}}templatestructLazy_Iterator{mutablepairm_C

c++ - 将 initializer_list 插入 std::vector 时出现 "Invalid iterator range"

此代码在Ideone上按预期编译并运行良好:#include#include#includeintmain(){std::vectorstrVec;strVec.insert(strVec.end(),{L"black",L"white",L"red"});strVec.insert(strVec.end(),{L"blue",L"green"});//STLexceptionfor(auto&i:strVec){std::wcout但是,在MSVC(VisualStudio2013)中因“无效的迭代器范围”而失败。有什么见解吗?顺便说一句,插入更多元素是可行的,例如在第二个插入中,这