2017-10-12 111 views
1

我只找到的regex_iterators例子被intialised作为regex_iterators可以用于自定义字符串类型吗?

regex_iterator::<string::iterator> 

如果我有一个包含字符序列的一类,例如:

class fooString { 
private: 
    deque<bar> data; 

    // ... other functionality ... 
} 

bar是一个类或结构是兼容std::to_string

如何使fooStringbar与正则表达式兼容,以便我可以拨打

fooString myFoo = ... 
regex e(/* some regex notation */); 
regex_iterator::<fooString::iterator> regIt(myFoo.begin(), myFoo.end(), e); 

......并且能够像对字符串一样遍历它吗?


我尝试了以下实验性功能:

std::deque<int> testDeque { 4, 5, 5, 5, 6, 7 }; 
    std::regex e("5{1,3}"); 
    std::regex_iterator<std::deque<int>::iterator> 
    regIt(testDeque.begin(), testDeque.end(), e); 

并得到编译错误

1>C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\regex(2271): error C2027: use of undefined type 'std::regex_traits<_Elem>' 
with 
[ 
    _Elem=int 
] 

所以我不认为双向迭代器就足够了,因为双端队列与遵守,我认为'酒吧'对象需要兼容。但我真的不确定。

+1

根据[此std :: regex_iterator参考](http://en.cppreference.com/w/cpp/regex/regex_iterator),迭代器需要是[双向迭代器](http:// en.cppreference.com/w/cpp/concept/BidirectionalIterator)。所以如果你的迭代器满足双向迭代器的要求,那么你很好。 –

+0

@Someprogrammerdude我认为数据类型Bar也需要满足一些特定的属性,但我不知道它是什么。 – Ian

回答

2

fooString必须满足双向迭代器的要求。 [bidirectional.iterators]​​是极其接近标准的措辞,所以你会没事的跟着它。

我将添加相关部分在这里:

  • 迭代器,r,必须满足两个操作--rr++
    • 这些操作返回参照同类型的迭代器
  • *r必须返回对迭代器迭代的类型的引用。
    • 一个reference类型根据什么cppreference列出了iterator_traits

如果BidirectionalIterator::value_type是不是一个标准的字符类型(任何事情你可以做一个std::basic_string用,例如,char),你会还需要专门regex_traits,虽然这是相当兔子洞下去。

+0

我尝试使用regex_iterator :: iterator>创建一个简单的测试,但是构造函数却抱怨“regex(2271):error C2027:使用未定义的类型'std :: regex_traits <_Elem>' - 带有_Elem = unsigned int所以除非我错误地认识到双向迭代器是不够的 - 正则表达式只适用于某些数据类型 – Ian

+0

@Ian:为什么要使用uint32_t?你需要一个字符类型 – AndyG

+0

针对我的真实情况我正在使用自定义结构(酒吧),我选择了uint32_t,因为我认为这是一个简单的类型来测试。我也用int测试了相同的结果。 - 我真正要问的是如何使FooString包含一个Bars结构工作吗?我认为FooString和Bar都需要一些特殊的酱油,而FooString可能是双向迭代器,我不知道它是什么Bar。 – Ian

相关问题