有沒有這樣的算法已經是標準資源庫中您可以使用std::find_if
和std::find_if_not
來手動編寫一個查找每個發生序列的開始和結束迭代器。我認爲輸出應該是std::pair<FwdIt, FwdIt>
的範圍。該算法在其輸入上具有O(N)
的複雜性。
#include <algorithm>
#include <iostream>
#include <iterator>
#include <vector>
#include <utility>
template<class FwdIt, class OutIt, class UnaryPred>
auto find_all_if(FwdIt first, FwdIt last, OutIt dst, UnaryPred pred)
{
while (first != last) {
// start of next occurance
auto next_b = std::find_if(first, last, pred);
if (next_b == last) break;
// end of next occurance
auto next_e = std::find_if_not(next_b, last, pred);
*dst++ = make_pair(next_b, next_e);
first = next_e;
}
return dst;
}
int main()
{
auto const v = std::vector<int> { 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1 };
using It = decltype(v.begin());
std::vector<std::pair<It, It>> r; // "range of ranges"
find_all_if(begin(v), end(v), std::back_inserter(r),
[](auto e) { return e == 1; }
);
for (auto&& e : r) {
std::cout << "[";
std::cout << std::distance(begin(v), e.first) << ", ";
std::cout << std::distance(begin(v), e.second) << "), ";
}
}
Live Example在C++ 14式(使用的良好的OLE C++ 98手動類型定義和功能對象)打印[0, 3), [4, 6), [8, 12)
您的輸入。
也許這個問題也可以表示爲更一般形式的標記化?在你的例子中,分隔符滿足v!= 1。 – user2672165
可能是'std :: partition_point'和'std :: stable_partition'可能的東西嗎? – P0W
我不清楚:*「應該返回三個子序列」*子序列應該如何返回?數組視圖的向量?迭代器?迭代器在容器中?範圍矢量? – Ali