這是喲說明我之前的評論:
#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發佈
歡呼聲,
來源
2011-06-28 15:17:17
ppi
是啊,這是它:)我怎麼忘了功能? –
你確定你想要這個功能嗎?對於範圍[first2,last2),*(i +(j-first2))== * j中的每個迭代器j,它都可以工作。 如果你只是想比較迭代器,這是過度殺傷:比較每個元素可能會花費你一些CPU週期 你想看看std :: distance()。 – ppi
@ppi原始問題明確顯示解引用迭代器。 –