2012-12-07 170 views
1

我有以下問題:我需要做一個函數,它需要兩個迭代器和一個值,並檢查兩者之間是否找到值。 catch:我只能有一個模板參數,它表示迭代器中元素的類型和值。聲明泛型迭代器

我的嘗試是這樣的,但似乎並沒有工作:

template <typename T> 
T myFind(iterator<std::bidirectional_iterator_tag,T> begin, iterator<std::bidirectional_iterator_tag, T> end, T elem){ 
// Code 
} 

但這不工作,那麼:

// vector<int> vect; list<string> lst; 
myFind(vect.begin(), vect.end(), 15); 
myFind(lst.begin(), lst.end(), "some element"); 

任何想法? 代碼後的變化:

template <typename T> 
T myFind(T begin, T end,typename std::iterator_traits<T>::value_type elem){ 
    for(T it = begin; it != end; ++it){ 
    if(*it == elem){ 
     return it; 
    } 
    } 
    return end; 
} 
+0

你爲什麼使用雙向迭代器? –

+0

這是我最後一次努力的一部分,使這項工作:) – Daniel

+1

「我只能有一個模板參數」 - 爲什麼?這是一個完全愚蠢的限制。 – Xeo

回答

1

你能有一個模板參數是迭代器類型?如果是這樣的話:

template <typename It> 
typename std::iterator_traits<It>::value_type 
myFind(It begin, It end, typename std::iterator_traits<It>::value_type elem){ 
    // ... 
} 

否則,我覺得你的限制太強了。

編輯完成後:如果您想對返回的迭代器執行-(如您在註釋中顯示的那樣),則需要隨機訪問迭代器。但是,std::list::iterator是一個雙向迭代器,所以你不能。您將需要使用std::prev(或在C++ 03中,使用std::advance)。

+0

這可能是它..我會試一試,回來一個反饋:) – Daniel

+0

這是我在尋找什麼,但它似乎不適用於列表。我正在嘗試「myFind(lst.begin(),lst.end(),」SOME sTRING「) - lst.begin());」但它是「沒有匹配的操作符在... – Daniel

+0

@Daniel'myFind'在這種情況下返回一個'std :: string',並且您正在嘗試對它執行' - lst.begin()'。想要你的'myFind'返回一個'It'而不是 –