金庆的专栏

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  423 随笔 :: 0 文章 :: 454 评论 :: 0 Trackbacks
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不保证其存储空间是连续的。

只是在已知的标准库字符串实现中都采用了连续的存储空间。

(转载请注明来源于金庆的专栏)
posted on 2008-04-23 15:36 金庆 阅读(2126) 评论(2)  编辑 收藏 引用 所属分类: 1. C/C++

评论

# re: STL序列容器的存储连续性[未登录] 2008-04-23 15:48 cppexplore
3个参数的是strncpy
就空间存储而言,还是用memcpy类函数
另因为string内存布局的不透明性,用memcpy也是不明智的选择,更遑论存储空间的连续性问题了。
就strcpy而言,取string的c_str()一定是没问题的。
  回复  更多评论
  

# re: STL序列容器的存储连续性 2008-04-26 18:53 feilng
正是没有明确的契约定义,导致一帮人要研究回字有几种写法
  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理