STL序列容器的存储连续性
2008-04-23 15:37
85 查看
STL序列容器的存储连续性
摘自《Extended STL》中译
C++标准库提供了四种序列容器:deque、list、vector,和basic_string。第四种序列容器basic_string,主要用于表示字符串,但它确实是不折不扣的序列容器,所以如果你非要这样做的话,你也可以用它来保存char和wchar_t以外的数据。
在标准库中的容器中,只有vector保证其元素的存储空间是连续的。因此,它和C API兼容。换句话说,对于一个非空的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
从存储空间的连续性考虑,下面的代码行为也是未定义的:
std::string s1("abc");
char s2[4];
assert(!s1.empty());
::strcpy(&s2[0], &s1[0], s1.size()); // Bad day . . . eventually
std::string不保证其存储空间是连续的。
只是在已知的标准库字符串实现中都采用了连续的存储空间。
(转载请注明来源于金庆的专栏)
摘自《Extended STL》中译
C++标准库提供了四种序列容器:deque、list、vector,和basic_string。第四种序列容器basic_string,主要用于表示字符串,但它确实是不折不扣的序列容器,所以如果你非要这样做的话,你也可以用它来保存char和wchar_t以外的数据。
在标准库中的容器中,只有vector保证其元素的存储空间是连续的。因此,它和C API兼容。换句话说,对于一个非空的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
从存储空间的连续性考虑,下面的代码行为也是未定义的:
std::string s1("abc");
char s2[4];
assert(!s1.empty());
::strcpy(&s2[0], &s1[0], s1.size()); // Bad day . . . eventually
std::string不保证其存储空间是连续的。
只是在已知的标准库字符串实现中都采用了连续的存储空间。
(转载请注明来源于金庆的专栏)
相关文章推荐
- STL序列容器的存储连续性
- STL序列容器的存储连续性
- 逆序存储小文件(一)——使用STL容器
- STL容器存储的内容动态分配情况下的内存管理
- STL概览-序列容器vector,deque,list
- 浅析stl序列容器(map和set)的仿函数排序
- 面试--stl容器--全局变量存储位置
- STL序列容器(vector)
- STL中序列容器之list
- STL序列容器之deque
- stl序列容器(map和set)的仿函数排序
- STL序列容器
- C++中防止STL中迭代器失效——map/set等关联容器——vector/list/deque等序列容器—如何防止迭代器失效—即erase()的使用
- STL学习2——序列容器
- STL序列容器vector、deque、list和array学习笔记
- STL_9: 序列容器
- STL学习系列之三——list序列容器
- STL容器:序列容器关联容器
- STL概览-序列容器vector,deque,list
- STL源码解析-04序列容器-01vector