2011-12-20 72 views
30

Trong C++, cách đơn giản nhất để chuyển đổi vec-tơ int (ví dụ: vector<int>) thành chuỗi là gì?Chuyển đổi vectơ thành chuỗi

+4

Một chuỗi những gì? Làm thế nào để bạn có ý định chuyển đổi mỗi số nguyên thành một chuỗi? Họ có đại diện cho mã ký tự ASCII hay bạn đang cố tạo danh sách số được phân tách bằng dấu phẩy? – meagar

+0

Bạn muốn kết quả trông như thế nào? – Mark

+0

Giả sử vectơ là: [1, 4, 7, 4, 9, 7], chuỗi sẽ là "1,4,7,4,9,7" – shn

Trả lời

40

lẽ 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

Cần lưu ý rằng 'vec.end() - 1 'chỉ được xác định rõ nếu người ta biết _for sure_ rằng' vec' là không trống. – ildjarn

+1

@ildjarn: Điểm tốt. Tương tự cho 'vec.back()'. –

+0

với phương pháp này, có thể ép buộc một số loại đệm? ví dụ, để có tất cả các số sử dụng 4 vị trí, bất kể số chữ số chúng có –

5

Đây là một sự thay thế trong đó sử dụng một iterator đầu ra tùy chỉnh. Ví dụ này hoạt động chính xác cho trường hợp danh sách trống. Ví dụ này chứng tỏ làm thế nào để tạo ra một biến lặp đầu ra tùy chỉnh, tương tự như 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

Tôi thường làm điều đó theo cách này ...

#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

nên bao gồm những tệp đầu nào? – qed

+0

Điều này là tốt cho mục đích hiển thị, nhưng không thể được sử dụng để tham gia với dấu phân cách tùy ý. – mtk

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(); 
} 

Đây là chức năng str có thể làm cho số nguyên biến thành một chuỗi và không phải vào một char cho những gì các số nguyên đại diện. Cũng làm việc cho đôi.

+0

Tôi đã nhầm lẫn cuộc gọi hàm tạo chuỗi của mình với một cuộc gọi đến một hàm có tên str. Druciferre sẽ không in một danh sách dấu phẩy được tách riêng, nó sẽ cố gắng biến số thành một char. – kpgbrink

+0

Xin lỗi câu hỏi không đủ cụ thể để tôi biết chính xác những gì anh ta muốn. Tôi không đọc những bình luận khác. – kpgbrink

Các vấn đề liên quan