STL序列容器的存儲(chǔ)連續(xù)性
摘自《Extended STL》中譯
C++標(biāo)準(zhǔn)庫(kù)提供了四種序列容器:deque、list、vector,和basic_string。第四種序列容器basic_string,主要用于表示字符串,但它確實(shí)是不折不扣的序列容器,所以如果你非要這樣做的話,你也可以用它來(lái)保存char和wchar_t以外的數(shù)據(jù)。
在標(biāo)準(zhǔn)庫(kù)中的容器中,只有vector保證其元素的存儲(chǔ)空間是連續(xù)的。因此,它和C API兼容。換句話說(shuō),對(duì)于一個(gè)非空的vector,下面的代碼是有意義的:
extern "C" void sort_ints(int* p, size_t n);
std::vector<int> v = . . .
assert(!v.empty());
sort_ints(&v[0], v.size());
但以下代碼的行為卻是未定義的:
std::deque<int> d = . . .
assert(!d.empty());
sort_ints(&d[0], d.size()); // This is a crash waiting to happen
從存儲(chǔ)空間的連續(xù)性考慮,下面的代碼行為也是未定義的:
std::string s1("abc");
char s2[4];
assert(!s1.empty());
::strcpy(&s2[0], &s1[0], s1.size()); // Bad day . . . eventually
std::string不保證其存儲(chǔ)空間是連續(xù)的。
只是在已知的標(biāo)準(zhǔn)庫(kù)字符串實(shí)現(xiàn)中都采用了連續(xù)的存儲(chǔ)空間。
(轉(zhuǎn)載請(qǐng)注明來(lái)源于金慶的專欄)
摘自《Extended STL》中譯
C++標(biāo)準(zhǔn)庫(kù)提供了四種序列容器:deque、list、vector,和basic_string。第四種序列容器basic_string,主要用于表示字符串,但它確實(shí)是不折不扣的序列容器,所以如果你非要這樣做的話,你也可以用它來(lái)保存char和wchar_t以外的數(shù)據(jù)。
在標(biāo)準(zhǔn)庫(kù)中的容器中,只有vector保證其元素的存儲(chǔ)空間是連續(xù)的。因此,它和C API兼容。換句話說(shuō),對(duì)于一個(gè)非空的vector,下面的代碼是有意義的:
extern "C" void sort_ints(int* p, size_t n);
std::vector<int> v = . . .
assert(!v.empty());
sort_ints(&v[0], v.size());
但以下代碼的行為卻是未定義的:
std::deque<int> d = . . .
assert(!d.empty());
sort_ints(&d[0], d.size()); // This is a crash waiting to happen
從存儲(chǔ)空間的連續(xù)性考慮,下面的代碼行為也是未定義的:
std::string s1("abc");
char s2[4];
assert(!s1.empty());
::strcpy(&s2[0], &s1[0], s1.size()); // Bad day . . . eventually
std::string不保證其存儲(chǔ)空間是連續(xù)的。
只是在已知的標(biāo)準(zhǔn)庫(kù)字符串實(shí)現(xiàn)中都采用了連續(xù)的存儲(chǔ)空間。
(轉(zhuǎn)載請(qǐng)注明來(lái)源于金慶的專欄)