首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >向量与字符串

向量与字符串
EN

Stack Overflow用户
提问于 2010-12-30 03:08:05
回答 7查看 12.2K关注 0票数 19

C++ std::vector和std::basic_string之间的根本区别是什么?

EN

回答 7

Stack Overflow用户

发布于 2010-12-30 03:26:07

  • basic_string不调用其元素的构造函数和析构函数。
  • 交换basic_string使迭代器无效(启用小字符串优化),交换向量doesn't.
  • basic_string内存可能不会在C++03中连续分配。向量总是连续的。在C++0x string.require中消除了这种差异:

basic_string对象中的类字符对象应连续存储在中

  • basic_string具有用于字符串操作的接口。矢量doesn't.
  • basic_string可以使用写入时拷贝策略(在C++11之前)。向量不能。

非信仰者的相关语录:

basic.string

类模板basic_string符合顺序容器(23.2.3)、可逆容器(23.2)和支持分配器的容器(表99)的要求,只是basic_string不使用allocator_traits::construct和allocator_- container::destroy构造或销毁其元素,并且basic_string的swap()使迭代器无效。basic_string支持的迭代器是随机访问迭代器(24.2.7)。

票数 21
EN

Stack Overflow用户

发布于 2010-12-30 03:15:43

basic_string为编译器和标准库实现提供了一些向量上的自由:

  1. “小字符串优化”在字符串上有效,它允许实现在字符串较短时将实际字符串存储在string对象中,而不是指向字符串的指针。大致是这样的:

类字符串{ char长度;联合{ size_t * usedWhenStringIsLong;char usedWhenStringIsShortsizeof(char*);};};

  • 在C++03中,基础数组不需要是连续的。在当前的标准下,以类似于“绳子”的方式实现basic_string是可能的。(虽然没有人这样做,因为这会使成员std::basic_string::c_str()std::basic_string::data()的实现成本太高。)

C++11现在禁止这种行为。

  • 在C++03中,basic_string允许编译器/库供应商对数据使用写入时复制(这可以保存在副本上),这对于std::vector是不允许的。在实践中,这曾经更常见,但现在不那么常见了,因为它对多线程有影响。但是,无论哪种方式,您的代码都不能依赖于std::basic_string是否使用COW实现。

C++11现在再次禁止此行为。

也有一些附加到basic_string上的助手方法,但大多数都很简单,当然可以很容易地在vector之上实现。

票数 12
EN

Stack Overflow用户

发布于 2010-12-30 03:14:12

关键的区别在于,当std::basic_string不能时,std::vector应该将其数据保存在连续内存中。结果是:

代码语言:javascript
运行
复制
std::vector<char> v( 'a', 3 );
char* x = &v[0]; // valid

std::basic_string<char> s( "aaa" );
char* x2 = &s[0];     // doesn't point to continuous buffer
//For example, the behavior of 
std::cout << *(x2+1);
//is undefined.
const char* x3 = s.c_str(); // valid

On practice this difference is not so important.

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4557009

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档