2010-03-25 42 views
11

Tôi đang cố chuyển một giá trị từ C++ sang TCL. Vì tôi không thể chuyển con trỏ mà không sử dụng một số mô-đun phức tạp, tôi đã nghĩ đến việc chuyển đổi một vectơ thành mảng char và sau đó truyền nó như một chuỗi kết thúc rỗng (tương đối dễ).Làm thế nào để chuyển đổi một vector <int> thành một chuỗi?

Tôi có một vector như sau:

12, 32, 42, 84 

mà tôi muốn chuyển đổi thành một cái gì đó như:

"12 32 42 48" 

Phương pháp Tôi đang nghĩ đến là sử dụng một iterator để lặp qua các vector và sau đó chuyển đổi từng số nguyên thành biểu diễn chuỗi của nó và sau đó thêm nó vào một mảng char (được tạo động ban đầu bằng cách truyền kích thước của vectơ). Đây có phải là cách đúng hay là có một chức năng đã thực hiện điều này?

+0

Chà, tôi cũng thế. Chính xác kịch bản này! –

Trả lời

40

gì về:

std::stringstream result; 
std::copy(my_vector.begin(), my_vector.end(), std::ostream_iterator<int>(result, " ")); 

Sau đó, bạn có thể vượt qua con trỏ từ result.str().c_str()

+0

Điều này sẽ không bao gồm các không gian, phải không? –

+0

Không gian được chuyển đến trình lặp, do đó chúng sẽ được bao gồm. – stefaanv

+2

Thưa ông, tôi sẽ không bao giờ một lần nữa quên về ostream_iterator và sao chép. Cảm ơn bạn. –

2

Bạn đã làm đúng, nhưng bạn có thể sử dụng std::ostringstream để tạo mảng char của mình.

#include <sstream> 

std::ostringstream StringRepresentation; 
for (vector<int>::iterator it = MyVector.begin(); it != MyVector.end(); it++) { 
    StringRepresentation << *it << " "; 
} 

const char * CharArray = StringRepresentation.str().c_str(); 

Trong trường hợp này, CharArray chỉ để đọc. Nếu bạn muốn sửa đổi các giá trị, bạn sẽ phải sao chép các giá trị đó. Bạn có thể đơn giản hóa điều này bằng cách sử dụng Boost.Foreach.

3

Tôi muốn sử dụng một stringstream để xây dựng chuỗi. Một cái gì đó như:

std::vector<int>::const_iterator it; 
std::stringstream s; 
for(it = vec.begin(); it != vec.end(); ++it) 
{ 
    if(it != vec.begin()) 
     s << " "; 

    s << *it; 
} 

// Now use s.str().c_str() to get the null-terminated char pointer. 
+0

+1 để tránh dấu cách của đề xuất của tôi. –

+0

Chi phí so sánh thêm nếu (it! = Vec.begin()). – Viet

4

Bạn có thể sử dụng copy kết hợp với một đối tượng stringstreamostream_iterator adapter:

#include <iostream> 

#include <sstream> 
#include <string> 
#include <vector> 
#include <algorithm> 
using namespace std; 

int main() 
{ 
    vector<int> v; 
    v.push_back(12); 
    v.push_back(32); 
    v.push_back(42); 
    v.push_back(84); 

    stringstream ss; 
    copy(v.begin(), v.end(), ostream_iterator<int>(ss, " ")); 
    string s = ss.str(); 
    s = s.substr(0, s.length()-1); // get rid of the trailing space 

cout << "'" << s << "'"; 

    return 0; 
} 

Output là:

'12 32 42 84'

+0

Cảm ơn bạn đã xóa dấu cách ... – Legend

+0

Trong trường hợp bạn gặp sự cố với VS2015 khi sử dụng ostream_iterator, hãy bao gồm làm tệp tiêu đề. – Akshay

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