2017-10-12 28 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

相關問題