Thiếu (điều hiển nhiên là) xây dựng chuỗi kiểu C trước rồi sử dụng chuỗi đó để tạo chuỗi std ::, có cách nào nhanh hơn / thay thế / "tốt hơn" để khởi tạo chuỗi từ một vectơ ký tự không?
Thiếu (điều hiển nhiên là) xây dựng chuỗi kiểu C trước rồi sử dụng chuỗi đó để tạo chuỗi std ::, có cách nào nhanh hơn / thay thế / "tốt hơn" để khởi tạo chuỗi từ một vectơ ký tự không?
Câu trả lời:
Tôi nghĩ bạn chỉ có thể làm
std::string s( MyVector.begin(), MyVector.end() );
trong đó MyVector là vector std :: của bạn.
_ITERATOR_DEBUG_LEVEL=1(trong trường hợp đó, nó có vẻ hoạt động tốt).
Với C ++ 11, bạn có thể làm std::string(v.data())hoặc, nếu vectơ của bạn không chứa một '\0'ở cuối std::string(v.data(), v.size()),.
string(&v[0], v.size())cũng sẽ hoạt động, nhưng chỉ sau đó assert(not v.empty());, vì nếu vector trống, cả hai v[0]và v.front()sẽ gọi hành vi không xác định. Điều đó, ngoài sự đơn giản về cú pháp của việc không phải sử dụng toán tử address-of, là lợi ích thực sự của hàm của C ++ 11, data()hàm này hoạt động ngay cả trên một vector trống.
std::string(v.data())có thể dẫn đến một chuỗi dài hơn. Vì vậy, không sử dụng cách này.
std::string(v.data(), v.size()), đã được đề cập rõ ràng trong câu trả lời vì lý do chính xác đó?
std::string s(v.begin(), v.end());
Trong đó v là khá nhiều thứ có thể lặp lại. (Cụ thể là begin () và end () phải trả về InputIterator.)
Chỉ để hoàn thiện, một cách khác là std::string(&v[0])(mặc dù bạn cần đảm bảo chuỗi của mình được kết thúc bằng null và std::string(v.data())thường được ưu tiên hơn.
Sự khác biệt là bạn có thể sử dụng kỹ thuật trước đây để truyền vector đến các hàm muốn sửa đổi bộ đệm, điều mà bạn không thể thực hiện với .data ().
data()để sửa đổi bộ đệm? Tôi trông giống như nếu bạn gọi data()một vectơ không phải const, nó sẽ trả về a T *(và nếu vectơ của bạn là const, 'v [0] `sẽ trả về a T const &).
vlà một chuỗi, nhưng kiểu đích là một chuỗi và vlà một vectơ. (Nhưng nó là tốt đẹp để thấy rằng C ++ 17 sẽ cung cấp cho chuỗi chẵn lẻ với vector.)
Tôi thích câu trả lời của Stefan (ngày 11 tháng 9 năm 13) nhưng muốn làm cho nó mạnh mẽ hơn một chút:
Nếu vectơ kết thúc bằng dấu chấm dứt rỗng, bạn không nên sử dụng (v.begin (), v.end ()): bạn nên sử dụng v.data () (hoặc & v [0] cho những người trước C ++ 17) .
Nếu v không có dấu chấm dứt rỗng, bạn nên sử dụng (v.begin (), v.end ()).
Nếu bạn sử dụng begin () và end () và vectơ có số 0 tận cùng, ví dụ: bạn sẽ kết thúc bằng một chuỗi "abc \ 0", có độ dài 4, nhưng thực sự chỉ nên là "abc".
vector<char> vec;
//fill the vector;
std::string s(vec.begin(), vec.end());
std::vector<char> v2(std::move(v))nhưng với astd::stringlà đối tượng mới.