İ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 ).
v
Bir dizge olsaydı bu doğru olurdu , ancak hedef türü bir dizedir ve v
bir 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
.