2011-12-20 158 views
30

在C++中,將整數的矢量(即vector<int>)轉換爲字符串的最簡單方法是什麼?將矢量轉換爲字符串

+4

一串什麼?你打算如何將每個整數轉換爲字符串?他們代表ASCII字符代碼,還是你想要建立一個以逗號分隔的數字列表? – meagar 2011-12-20 20:56:23

+0

你想要輸出看起來像什麼? – Mark 2011-12-20 20:56:36

+0

說向量是:[1,4,7,4,9,7],字符串將是「1,4,7,4,9,7」 – shn 2011-12-20 20:59:23

回答

40

也許std::ostream_iteratorstd::ostringstream

#include <vector> 
#include <string> 
#include <algorithm> 
#include <sstream> 
#include <iterator> 
#include <iostream> 

int main() 
{ 
    std::vector<int> vec; 
    vec.push_back(1); 
    vec.push_back(4); 
    vec.push_back(7); 
    vec.push_back(4); 
    vec.push_back(9); 
    vec.push_back(7); 

    std::ostringstream oss; 

    if (!vec.empty()) 
    { 
    // Convert all but the last element to avoid a trailing "," 
    std::copy(vec.begin(), vec.end()-1, 
     std::ostream_iterator<int>(oss, ",")); 

    // Now add the last element with no delimiter 
    oss << vec.back(); 
    } 

    std::cout << oss.str() << std::endl; 
} 
+7

值得注意的是'vec.end() - 1 '只有在確實知道'vec'非空時纔有明確的定義。 – ildjarn 2011-12-20 21:10:46

+1

@ildjarn:好點。 'vec.back()'相同。 – 2011-12-20 21:11:30

+0

用這種方法,是否可以強制某種填充?例如,讓所有的號碼都使用4個位置,不管他們有多少位數 – 2015-12-03 05:03:10

5

這裏是使用定製的輸出迭代的替代方案。這個例子對於空列表來說行爲正確。此示例演示如何創建自定義輸出迭代器,類似於std::ostream_iterator

#include <iterator> 
#include <vector> 
#include <iostream> 
#include <sstream> 

struct CommaIterator 
: 
    public std::iterator<std::output_iterator_tag, void, void, void, void> 
{ 
    std::ostream *os; 
    std::string comma; 
    bool first; 

    CommaIterator(std::ostream& os, const std::string& comma) 
    : 
    os(&os), comma(comma), first(true) 
    { 
    } 

    CommaIterator& operator++() { return *this; } 
    CommaIterator& operator++(int) { return *this; } 
    CommaIterator& operator*() { return *this; } 
    template <class T> 
    CommaIterator& operator=(const T& t) { 
    if(first) 
     first = false; 
    else 
     *os << comma; 
    *os << t; 
    return *this; 
    } 
}; 

int main() { 
    // The vector to convert 
    std::vector<int> v(3,3); 

    // Convert vector to string 
    std::ostringstream oss; 
    std::copy(v.begin(), v.end(), CommaIterator(oss, ",")); 
    std::string result = oss.str(); 
    const char *c_result = result.c_str(); 

    // Display the result; 
    std::cout << c_result << "\n"; 
} 
34

我通常做這種方式...

#include <string> 
#include <vector> 

int main(int argc, char* argv[]) 
{ 
    std::vector<char> vec; 
    //... do something with vec 
    std::string str(vec.begin(), vec.end()); 
    //... do something with str 
    return 0; 
} 
+0

應該包含哪些頭文件? – qed 2014-02-05 14:31:16

+0

這是很好的顯示目的,但不能用於加入任意分隔符。 – mtk 2016-06-10 11:58:42

0
template<typename T> 
string str(T begin, T end) 
{ 
    stringstream ss; 
    bool first = true; 
    for (; begin != end; begin++) 
    { 
     if (!first) 
      ss << ", "; 
     ss << *begin; 
     first = false; 
    } 
    return ss.str(); 
} 

這是STR功能,可以使整數變成一個字符串,而不是到什麼整數代表一個字符。也適用於雙打。

+0

我很困惑他的字符串構造函數調用與一個名爲str的函數的調用。 Druciferre不會打印一個逗號分隔的數字列表,它會嘗試將數字轉換爲字符。 – kpgbrink 2014-12-18 06:38:32

+0

對不起,這個問題還不夠具體,我不知道他想要什麼。我沒有閱讀其他評論。 – kpgbrink 2014-12-18 18:36:39