这对于保持和访问二进制数据更好的C ++容器?
std::vector<unsigned char>
要么
std::string
是一个比另一个更有效?
是一个更“正确”的用法?
这对于保持和访问二进制数据更好的C ++容器?
std::vector<unsigned char>
要么
std::string
是一个比另一个更有效?
是一个更“正确”的用法?
你应该更喜欢std::vector
过度std::string
。 在普通情况下,这两种解决方案几乎可以等同,但std::string
s的字符串和字符串操作专门设计的,这是不是您的使用目的。
两者都是正确的,同样有效。 使用这些而不是一个简单的阵列中的一个是只缓解存储器管理和将它们作为参数。
我使用矢量,因为其意图是比字符串更加清晰。
编辑:C ++ 03标准并不能保证std::basic_string
内存连续性。 但是从实际情况来看,没有商业的非连续实现。 的C ++ 0x设置为规范这一事实 。
是一个比另一个更有效?
这是一个错误的问题。
是一个更“正确”的用法?
这是正确的问题。
这取决于。 被如何使用的数据? 如果你想在喜欢fashon字符串使用数据,那么你应该选择的std :: string作为使用一个std ::向量可能会混淆后续维护。 如果在另一方面大部分数据操纵的看起来像普通的数学或载体等,然后一个std ::矢量较适宜。
这是dribeas答案评论。 我把它写成一个答案可以设置代码的格式。
这是char_traits比较功能,并且行为是很健康:
static bool
lt(const char_type& __c1, const char_type& __c2)
{ return __c1 < __c2; }
template<typename _CharT>
int
char_traits<_CharT>::
compare(const char_type* __s1, const char_type* __s2, std::size_t __n)
{
for (std::size_t __i = 0; __i < __n; ++__i)
if (lt(__s1[__i], __s2[__i]))
return -1;
else if (lt(__s2[__i], __s1[__i]))
return 1;
return 0;
}
时间最长的,我同意这里大多数的答案。 然而,就在今天打我为什么它可能是更明智的,实际使用std::string
过std::vector<unsigned char>
。
由于大多数人认为,无论使用哪一种工作得很好。 但很多时候,文件的数据实际上可以(现在比较普遍具有成为主流XML)是文本格式。 这可以很容易地查看在调试器当它成为相关(而且这些调试器会经常让你浏览字符串的字节反正)。 但更重要的是,可以在字符串中使用许多现有的功能,可以很容易地在文件/二进制数据使用。 我发现自己写多个函数来处理字符串和字节数组,并意识到这一切是如何毫无意义了。
至于可读性而言,我更喜欢的std ::向量。 的std ::载体应该是在这种情况下,默认容器:其目的是更清晰,如已经由其他的答案说,在大多数的实现,也更有效。
有一次我做喜欢的std :: string过的std ::向量虽然。 让我们来看看在C ++ 11的移动构造函数的签名:
矢量(矢量&& X);
串(串&& STR)noexcept;
那一次我真的需要一个noexcept移动构造函数。 的std :: string提供它和std :: vector的没有。
如果你只是希望存储二进制数据,你可以使用bitset
这对于空间分配优化。 否则,去为vector
,因为它更适合您的使用。
比较这2,选择自己这是你更具体。 两者都非常强劲,STL算法的工作...选择自己至极是你的任务更有效
我个人比较喜欢的std :: string由于字符串::数据()对我来说更加直观,当我想我的二进制缓冲区早在C-兼容的形式。 我知道,向量元素,保证存储在连续行使代码这种感觉有点不安。
这是一种风格的决定,个人开发者或团队应该为自己。