2012-06-14 41 views
7

Tôi đang cố gắng cvopy boost::array<char> đến std::string.Sao chép tăng :: mảng <char> thành std :: string

boost::array<char, 1024> _buffer; 
std::string data; 
std::copy(_buffer.begin(), _buffer.begin()+bytes_transferred, data.begin()); 

không hoạt động. Vì vậy, tôi đã thay đổi nó một chút.

char _buffer[1024]; 
std::string data; 
std::copy(_buffer, _buffer+bytes_transferred, data.begin()); 

thứ hai không hoạt động.

+0

Vì vậy, ý của bạn chính xác là gì khi "không hoạt động"? – sth

Trả lời

5

Bạn có thể sử dụng back_insert_iterator. Việc gán cho nó sẽ gọi hàm push_back của vùng chứa bên dưới, do đó bạn không cần phải lo lắng về việc phân bổ không gian theo cách thủ công.

std::copy(_buffer.begin(), _buffer.begin()+bytes_transferred, std::back_inserter(data)); 
+1

Trong khi công trình này, tôi nghĩ rằng nó ít hiệu quả hơn nhiều so với việc sử dụng hàm tạo. Tôi nghi ngờ trình biên dịch là đủ thông minh để nhận ra rằng nó có thể tối ưu hóa điều này vào một bản sao bộ nhớ khối. – templatetypedef

+0

@templatetypedef Tôi đồng ý. Tôi đã đăng điều này vì mục đích hoàn thành, tôi đoán vậy. – jrok

15

Vấn đề ở đây là copy giả định không gian đó đã tồn tại cho dữ liệu bạn đang viết; nó không tạo ra bất kỳ phòng mới nào cho bạn. Do đó, cả hai đoạn mã trên đều gây ra hành vi không xác định, vì bạn sẽ sao chép các ký tự vào một vị trí mà trước đó không gian đã được đặt trước.

Cách tốt nhất để làm điều này sẽ được sử dụng string constructor:

boost::array<char, 1024> _buffer; 
std::string data(_buffer.begin(), _buffer.end()); 

hoặc

char _buffer[1024]; 
std::string data(_buffer, _buffer + 1024); 

này sẽ khởi tạo chuỗi như một bản sao của dữ liệu được lưu trữ trong mảng.

Hy vọng điều này sẽ hữu ích!

+0

Vì vậy, tôi cần phải 'dự ​​trữ()' Nếu tôi muốn sử dụng 'std :: copy'? và tại sao không 'std :: copy' sụp đổ? –

+3

@ DiproSen- Không, 'dự trữ' sẽ không sửa lỗi này. Bạn sẽ cần phải 'resize' chuỗi để có đủ không gian trước khi sử dụng' std :: copy'. 'dự trữ' phục vụ một chức năng hoàn toàn khác. Đối với lý do tại sao không có tai nạn, tôi hoàn toàn không có ý tưởng. Đó là hành vi không xác định, có nghĩa là chương trình có thể làm bất cứ điều gì. Không bị lỗi hoàn toàn hợp pháp bởi thông số C++. – templatetypedef

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