2012-02-16 67 views
1

我希望我可以通過使用cout < <來打印set/vector/map的內容。對於設計師來說,這似乎並不困難:假設爲T定義了< <,容器的< <可以迭代遍歷元素並使用流< <來打印它們。重載<< operator C++ stl containers

有沒有簡單的方法來打印他們,我不知道?

如果不是,是否有簡單的解決方案?我已經在擴展stl類的地方閱讀是一個壞主意。是這樣嗎?爲什麼?

如何定義類似於重載打印功能的東西? 編輯: 我找了一個遞歸函數,它可以處理的集裝箱的集裝箱...... 我認爲,不同的人想不同的格式,但覆蓋的東西是聊勝於無

+1

[Pretty-print C++ STL containers]的可能重複(http:// stackoverflow。com/questions/4850473/pretty-print-c-stl-containers) – ildjarn 2012-02-16 22:08:45

+0

相當不錯的解決方案 – 2012-07-09 09:27:52

回答

3

也許最簡單的方式來輸出STL容器是

std::copy(cont.begin(), cont.end(), 
      std::ostream_iterator<Type>(std::cout, " ")); 

其中Typecont的元素(例如,如果是cont類型std::vector<int>的然後Type必須int)的類型。

當然,您可以使用任何ostream而不是std::cout

+0

'Type'被稱爲'container_type :: value_type'。 – ildjarn 2012-02-16 22:11:17

+1

@ildjarn:但是你仍然必須指定'container_type',除非你在一個容器類型爲dependend的模板(但是它是'typename container_type :: value_type'),否則很可能包含'Type'無論如何。但是,在C++ 11中,您可以編寫'decltype(cont):: value_type'(再次,可能在模板中使用'typename')。 – celtschk 2012-02-16 22:15:05

2

在C++ 11可以使用for基於範圍的:

for (auto& i: container) cout << i << " "; 
cout << endl; 
2

最簡單的EAY轉儲容器可能只是使用std::copy()。例如,我通常使用類似這樣的東西:

template <typename C> 
std::string format(C const& c) { 
    std::ostringstream out; 
    out << "["; 
    if (!c.empty()) { 
     std::copy(c.begin(), --c.end(), 
      std::ostream_iterator<typename C::value_type>(out, ", ")); 
      out << c.back(); 
    } 
    out << "]"; 
    return out.str(); 
} 

是的,這並不總是工作,但適用於我的需要。這實際上顯示了標準庫中沒有容器輸出的問題之一:容器格式化的方式有很多種。更糟的是,格式化的輸出應該在事情​​變得真正有趣的地方可讀。所有這些都是可行的,但我不知道相應的建議。

0

它顯得不那麼困難的STL設計者實現:假設< <爲T定義,< <的容器可以只通過迭代的元素,並使用ofstream的< <打印出來。

當然這對他們並不難。但是,問問自己:輸出格式對每個客戶都有意義嗎?標準庫是關於重用和通用性的。將容器與一些任意的輸出格式規則耦合使得它們僅僅爲了一些而不那麼通用。

因此,推薦的解決方案是提供您自己的operator<<(std::ostream &, T)和/或採用其他通用算法,例如, <algorithms>