2016-01-01 58 views
7

我想出了以下內容:傳遞一個std容器的功能

template <typename T> inline void printcontainer(std::vector<T> container) 
{ 
    for(auto it = container.begin(); it != container.end(); it++) 
    { 
     std::cout << *it << std::endl; 
    } 
} 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
    std::vector<int> v; 
    v.push_back(5); 
    v.push_back(4); 
    v.push_back(3); 
    printcontainer(v); 

    return 0; 
} 

(對不起,我push_backs,視覺工作室不接受初始化列表...啊!!)

現在這個函數被限制爲std::vector,我怎樣才能讓它可以通過其他的容器,比如std::list數組等等......

+0

++您正在使用什麼版本的VC不支持初始化列表? – MikeMB

+0

visual studio 2012,像'std :: vector v {1,2,3};'這樣的東西不被支持,所以你必須使用我非常鄙視的c樣式數組解決方法。它也沒有'std :: initializer_list'很奇怪的呃。 –

+0

對,我已經習慣了C++ 11,我忘了VS採用了很多/最? C++ 11功能不在VS 2013之前。 – MikeMB

回答

7

只是不要在容器存儲的類型上模板,而是在類型上容器本身:

template <typename Container> 
inline void printcontainer(const Container &container) 

請注意,我將參數更改爲const引用以避免不必要的副本。

您可以通過使用非成員std::beginstd::end或使用range based for loop概括您的打印功能C數組:

template <typename Container> 
inline void printcontainer(const Container &container) { 
    for (const auto &v : container) 
     std::cout << v << "\n"; 
} 

OT備註:您可能不需要inline這裏。

+0

哇我對(const auto&v:container)''印象深刻'這叫做怎麼樣?我會研究它 –

+2

[基於範圍的循環(自C++ 11以來)](http://en.cppreference.com/w/cpp/language/range-for) – Drop

+0

tyvm,我會接受這個答案儘快允許! –

2

傳遞容器對象是對付經典Stepanov的STL 容器迭代器算法泛型編程風格。

一般人會通過迭代器:

# define ForwardIterator typename // workaround untill we have concepts 

template <ForwardIterator It> inline void printcontainer(It begin, It end) 
{ 
    for(;begin != end; ++begin) 
    { 
     std::cout << *begin << std::endl; 
    } 
} 

用法:

std::vector<int> v = {1, 2, 3, 4}; 
printcontainer(v.cbegin(), v.cend()); 
+0

*「您正試圖在C++文件中編寫Java。」*如何?我看到在這裏通過容器沒有問題。事實上,boost在標準庫中提供了許多基於迭代器的函數的容器版本,以減少冗長。 (不是我的DV btw。) –

+0

@BaummitAugen好吧,它有點太多,我會刪除這個短語;) – Drop

+1

雖然這名義上似乎確定,這個宏只是醜陋的,值得自己downvote所有。此外,螺旋迭代器,範圍是未來。 – Puppy