Singkatnya (yang sudah jelas) membangun string gaya C terlebih dahulu kemudian menggunakannya untuk membuat std :: string, apakah ada cara yang lebih cepat / alternatif / "lebih baik" untuk menginisialisasi string dari vektor karakter?
Singkatnya (yang sudah jelas) membangun string gaya C terlebih dahulu kemudian menggunakannya untuk membuat std :: string, apakah ada cara yang lebih cepat / alternatif / "lebih baik" untuk menginisialisasi string dari vektor karakter?
Jawaban:
Saya pikir Anda bisa melakukannya
std::string s( MyVector.begin(), MyVector.end() );
di mana MyVector adalah std :: vector Anda.
_ITERATOR_DEBUG_LEVEL=1
(dalam hal ini tampaknya berfungsi dengan baik).
Dengan C ++ 11, Anda dapat melakukan std::string(v.data())
atau, jika vektor Anda tidak mengandung a '\0'
di akhir std::string(v.data(), v.size())
,.
string(&v[0], v.size())
harus bekerja juga, tetapi hanya setelah assert(not v.empty());
, karena jika vektor kosong, baik v[0]
dan v.front()
akan memanggil perilaku tidak terdefinisi. Itu, selain dari kesederhanaan sintaksis karena tidak harus menggunakan operator alamat, adalah manfaat nyata dari data()
fungsi C ++ 11 , yang bekerja bahkan pada vektor kosong.
std::string(v.data())
mungkin menyebabkan string yang lebih panjang. Jadi jangan gunakan cara ini.
std::string(v.data(), v.size())
, yang secara eksplisit disebutkan dalam jawaban karena alasan yang tepat?
std::string s(v.begin(), v.end());
Di mana v cukup banyak hal yang dapat diulang. (Secara khusus begin () dan end () harus mengembalikan InputIterator.)
Hanya untuk kelengkapan, cara lain adalah std::string(&v[0])
(meskipun Anda perlu memastikan string Anda diakhiri null dan std::string(v.data())
umumnya lebih disukai.
Perbedaannya adalah Anda dapat menggunakan teknik sebelumnya untuk meneruskan vektor ke fungsi yang ingin mengubah buffer, yang tidak dapat Anda lakukan dengan .data ().
data()
untuk mengubah buffer? Menurut saya, jika Anda memanggil data()
vektor non-const, ia akan mengembalikan a T *
(dan jika vektor Anda adalah const, 'v [0] `akan mengembalikan a T const &
).
v
berupa string, tetapi tipe targetnya adalah string dan v
vektor. (Tapi bagus untuk melihat bahwa C ++ 17 akan memberikan string paritas dengan vektor.)
Saya suka jawaban Stefan (11 Sep. '13) tetapi ingin membuatnya sedikit lebih kuat:
Jika vektor diakhiri dengan terminator null, Anda tidak boleh menggunakan (v.begin (), v.end ()): Anda harus menggunakan v.data () (atau & v [0] untuk yang sebelum C ++ 17) .
Jika v tidak memiliki terminator null, Anda harus menggunakan (v.begin (), v.end ()).
Jika Anda menggunakan begin () dan end () dan vektor memiliki nol penghentian, Anda akan berakhir dengan string "abc \ 0" misalnya, yang panjangnya 4, tetapi seharusnya hanya "abc".
vector<char> vec;
//fill the vector;
std::string s(vec.begin(), vec.end());
std::vector<char> v2(std::move(v))
tetapi dengan astd::string
sebagai objek baru.