İlk olarak bir C stili dizginin (apaçık) oluşturulmasından sonra bunu bir std :: dizge oluşturmak için kullanılmasından kısa, bir karakter vektöründen bir dizgeyi başlatmak için daha hızlı / alternatif / "daha iyi" bir yol var mı?
İlk olarak bir C stili dizginin (apaçık) oluşturulmasından sonra bunu bir std :: dizge oluşturmak için kullanılmasından kısa, bir karakter vektöründen bir dizgeyi başlatmak için daha hızlı / alternatif / "daha iyi" bir yol var mı?
Yanıtlar:
Bence yapabilirsin
std::string s( MyVector.begin(), MyVector.end() );
MyVector, std :: vektörünüzdür.
_ITERATOR_DEBUG_LEVEL=1(bu durumda iyi çalışıyor gibi görünüyor).
C ++ 11 ile yapabilir std::string(v.data())veya vektörünüzün '\0'sonunda a içermiyorsa std::string(v.data(), v.size()),.
string(&v[0], v.size())aynı zamanda çalışacaktır ama sonra assert(not v.empty());, vektör boş, hem eğer bu yana v[0]ve v.front()tanımsız davranış çağırmak olacaktır. Bu, adres operatörünü kullanmak zorunda olmamanın sözdizimsel basitliğinin yanı sıra, data()boş bir vektörde bile çalışan C ++ 11 işlevinin gerçek faydasıdır.
std::string(v.data())daha uzun bir dizeye yol açabilir. Öyleyse bu şekilde kullanmayın.
std::string(v.data(), v.size())Tam da bu nedenle cevapta açıkça belirtilen neyin yanlış ?
std::string s(v.begin(), v.end());
V neredeyse yinelenebilir bir şeydir. (Özellikle begin () ve end (), InputIterators döndürmelidir.)
Tamlık için, başka bir yol da std::string(&v[0])(dizenizin boş sonlandırılmış olmasını sağlamanız gerekmesine rağmen std::string(v.data())genellikle tercih edilmelidir.
Aradaki fark, vektörü arabelleği değiştirmek isteyen işlevlere geçirmek için eski tekniği kullanabilmenizdir, ki bunu .data () ile yapamazsınız.
data()Arabelleği değiştirmek için neden kullanamıyorsunuz ? Bana data(), const olmayan bir vektörü çağırırsanız , a döndürür gibi görünüyor T *(ve vektörünüz const ise, 'v [0] " T const &yine de a döndürür ).
vBir dizge olsaydı bu doğru olurdu , ancak hedef türü bir dizedir ve vbir vektördür. (Ama C ++ 17'nin dizelere vektörle eşitlik vereceğini görmek güzel.)
Stefan'ın cevabını beğendim (11 Eylül 2013) ama biraz daha güçlü hale getirmek istiyorum:
Vektör boş bir sonlandırıcı ile biterse, (v.begin (), v.end ()) kullanmamalısınız: v.data () (veya C ++ 17'den öncekiler için & v [0] kullanmalısınız) .
V'nin boş bir sonlandırıcısı yoksa, (v.begin (), v.end ()) kullanmalısınız.
Begin () ve end () kullanırsanız ve vektörün sonlandırıcı bir sıfıra sahipse, örneğin 4 uzunluğunda bir "abc \ 0" dizesi elde edersiniz, ancak gerçekten sadece "abc" olmalıdır.
vector<char> vec;
//fill the vector;
std::string s(vec.begin(), vec.end());
std::vector<char> v2(std::move(v))bir şeystd::string.