2011-11-23 46 views
29

Tôi đang sử dụng thư viện chấp nhận dữ liệu dưới dạng vector trong số char s. Tôi cần chuyển một số string vào thư viện.Chuyển đổi std :: string thành std :: vector <char>

Tôi nghĩ về việc sử dụng std::vector hàm tạo chấp nhận trình vòng lặp để thực hiện chuyển đổi - nhưng tự hỏi liệu có cách nào tốt hơn để làm điều đó không?

/*Note: json_str is of type std::string*/ 
const std::vector<char> charvect(json_str.begin(), json_str.end()); 
+3

Bạn có tò mò hay bạn thực sự đo lường và xác định rằng một phần quan trọng trong chương trình của bạn được chi tiêu cho việc sao chép chuỗi? –

Trả lời

25

Không, đó là cách để làm điều đó, trực tiếp khởi tạo vectơ với dữ liệu từ chuỗi.

Khi @ildjarn chỉ ra trong nhận xét của mình, nếu vì lý do nào đó, bộ đệm dữ liệu của bạn cần phải được hủy kết thúc, bạn cần thêm rõ ràng nó với charvect.push_back('\0').

Cũng lưu ý, nếu bạn muốn sử dụng lại bộ đệm, hãy sử dụng hàm thành viên assign có trình vòng lặp.

+9

Lưu ý rằng nếu dữ liệu cần phải được kết thúc bằng null, thì null kết thúc sẽ phải được đẩy lùi lại theo cách thủ công. – ildjarn

+6

@ildjarn: Điểm tốt. Tuy nhiên, nó sẽ là lạ cho một bộ đệm dữ liệu được null chấm dứt, nhưng bạn không bao giờ biết ... – Xeo

+0

Lưu ý rằng kể từ khi C++ 11 'std :: string' buộc phải sử dụng null chấm dứt chuỗi trong bộ đệm bên trong của nó. Vì vậy, push_back đó không còn cần thiết nữa. – Manu343726

11

Phương pháp điền vector của bạn là tốt - trên thực tế, có thể là tốt nhất trong hầu hết các trường hợp.

Chỉ để bạn biết tuy nhiên, đó không phải là cách duy nhất. Bạn cũng có thể chỉ cần sao chép nội dung của số string vào số vector<char>. Điều này sẽ hữu ích nhất khi bạn có một vector đã được khởi tạo hoặc nếu bạn muốn nối thêm nhiều dữ liệu hơn vào cuối - hoặc tại bất kỳ thời điểm nào, thực sự.

Ví dụ, nơi s là một std::stringv là một std::vector<char>:

std::copy(s.begin(), s.end(), std::back_inserter(v)); 

Như với trường hợp nhà xây dựng, nếu bạn cần một null-terminator sau đó bạn sẽ cần phải đẩy mà sao mình:

v.push_back('\0'); 
Các vấn đề liên quan