2011-06-28 44 views
4

假設我們有兩個範圍r1 = [first1, last1)r2 = [first2, last2)檢查一個範圍是另一個範圍在一個不錯的,STL十歲上下的方式小範圍

假設r2子範圍r1當且僅當存在這樣的i>=0

  1. [first1 + i, first1 + i + last2 - first2)在有效範圍

  2. [0, last2 - first2)下式成立所有的j:

    *(first1 + i + j) == *(first2 + j) 
    

嵌套循環可以很容易地確定是否r2r1的子範圍,或甚至一個迴路具有嵌套調用std::equal模板。是否有更多的STL-ish,簡潔的方式來表達C++中的相同想法?也歡迎C++ 0x解決方案。提前致謝。

回答

3

我認爲std::search是你在找什麼。從http://www.cplusplus.com/reference/algorithm/search/ [std::search]「搜索範圍[first1,last1)查找由[first2,last2)定義的序列的第一個匹配項,並將迭代器返回到它的第一個元素。」

+0

是啊,這是它:)我怎麼忘了功能? –

+0

你確定你想要這個功能嗎?對於範圍[first2,last2),*(i +(j-first2))== * j中的每個迭代器j,它都可以工作。 如果你只是想比較迭代器,這是過度殺傷:比較每個元素可能會花費你一些CPU週期 你想看看std :: distance()。 – ppi

+1

@ppi原始問題明確顯示解引用迭代器。 –

0

這是喲說明我之前的評論:

#include <iostream> 
#include <vector> 
#include <iterator> 

template<class MyIterator> 
bool is_subrange(const MyIterator& first1, const MyIterator& last1, const MyIterator& first2, const MyIterator& last2) 
{ 
    return std::distance(first1, first2) >=0 && std::distance(last2, last1) >= 0; 
} 

int main() 
{ 
    std::vector<int> v; 
    for (int i=0; i < 100; ++i) 
     v.push_back(i); 
    std::cout << std::distance(v.begin(), v.end()) << std::endl; 
    std::cout << std::distance(v.end(), ++v.begin()) << std::endl; 
    std::cout << is_subrange(v.begin(), v.end(), ++v.begin(), --v.end()) << std::endl; 
    std::cout << is_subrange(++v.begin(), v.end(), v.begin(), --v.end()) << std::endl; 

    return 0; 
} 

用相同的簡單容器,如載體內的子範圍時,這避免了比較每個元素。

當然,函數is_subrange()非常簡單,對列表來說更復雜,因爲它們是雙重鏈接的,因此距離永遠不會是負數。 std :: distance(l.begin(),l.end())== 1和std :: distance(l.end(),l.begin())== 1是可能的。 作爲[100,0]和[20,4]的範圍也不是由這個簡單樣本處理,但它是可行的。

反正的std ::搜索()將做的工作是以前由Mark-B發佈

歡呼聲,

相關問題