2014-12-30 101 views
1

我不知道我能找到的答案是做我需要的最簡單的方法。簡單的模板,我會知道如何修改成一個完整的解決我的問題將是代碼,完成以下操作:C++泛型迭代器

  1. 的輸入是兩個迭代器指向一個迭代容器的開頭和結尾(矢量,列表...)包含值類型爲T的東西。

  2. 返回一個std::vector<T>,其中包含輸入容器的逐個元素副本,以任意順序複製輸入容器的開始到結束。

東西非功能將會像如下:

template<typename Iterator, typename T> 
std::vector<T> dumb_copy(Iterator first, Iterator last) { ... } 

問題是,我需要編譯器以某種方式檢查我指着T類型的東西給迭代器

我目前正在學習C++,並將實踐中的某些算法的最通用的實現方式寫作爲我能想到的,所以我想從一開始就獲得最佳實踐。如果有一種使用C++ 11構造的簡單方法,那對我來說很好。

+1

你爲什麼需要這個?你不能只從兩個迭代器構造矢量嗎?順便說一句,標準庫迭代器定義了'value_type',它給你'T'。 – juanchopanza

+0

我以爲我需要這個,因爲我還沒有到Stroustrup那麼遠...... – JT1

回答

7

您可以簡單地使用特性完全去除T類型,允許它被自動確定:

template <typename Iterator> 
std::vector<typename std::iterator_traits<Iterator>::value_type> 
    dumb_copy(Iterator first, Iterator last) 
{ 
    std::vector<typename std::iterator_traits<Iterator>::value_type> copy; 

    // Populate the copy vector 

    return copy; 
} 

特別要注意的是std::iterator_traits具有當迭代器類型是一個指針專業化,因此這將允許你的函數「正常工作」,即使它傳遞的是指針而不是「真正的」迭代器對象。

2

您不需要這樣做,因爲標準庫容器已經以這種方式工作。所以,你可以直接創建std::vector從兩個迭代器:

#include <string> 
#include <vector> 
#include <iostream> 

int main() 
{ 
    std::string s = "hello"; // iterable container 

    // construct a vector using two iterators 
    std::vector<std::string::value_type> v(s.begin(), s.end()); 

    // check the results 
    for(unsigned i = 0; i < v.size(); ++i) 
     std::cout << v[i]; 
    std::cout << '\n'; 
} 
+0

謝謝。正如我所說的,模板的要點只是爲了獲得正確的類型。我感興趣的是實現一個算法,它將通過輸入容器順序遍歷,進行一些不重要的處理,並將解決方案存儲到向量中。 – JT1

+0

@ JT1然後聽起來你可能從'std :: for_each()'中受益:http://www.cplusplus.com/reference/algorithm/for_each/ – Galik

2

您只需創建一個std::vector<T>與類型匹配的*it結果的迭代器之一:

#include <type_traits> 
#include <vector> 
template <typename Iterator> 
auto dump_copy(Iterator begin, Iterator end) 
    -> std::vector<typename std::decay<decltype(*begin)>::type> { 
    return std::vector<typename std::decay<decltype(*begin)>::type(begin, end); 
} 

用C++ 14您可以用std::decay_t<X>代替typename std::decay<X>::type