哪个是用于保存和访问二进制数据的更好的c ++容器?
std::vector<unsigned char>
或
std::string
一个比另一个更有效吗? 是一个更“正确”的用法吗?
答案 0 :(得分:26)
您应该更喜欢std::vector
而不是std::string
。在一般情况下,两个解决方案几乎都是等效的,但std::string
s专门设计用于字符串和字符串操作,这不是您的预期用途。
答案 1 :(得分:13)
两者都是正确且同样有效的。使用其中一个而不是普通数组只是为了简化内存管理并将它们作为参数传递。
我使用vector是因为意图比使用string更清晰。
编辑: C ++ 03标准不保证std::basic_string
内存连续性。然而,从实践的角度来看,没有商业非连续的实现。 C ++ 0x设置为standardize that fact。
答案 2 :(得分:4)
一个比另一个更有效吗?
这是一个错误的问题。
这是一个更“正确”的用法吗?
这是正确的问题 这取决于。如何使用数据?如果您要使用像fashon这样的字符串中的数据,那么您应该选择std :: string,因为使用std :: vector可能会混淆后续的维护者。另一方面,如果大多数数据操作看起来像普通的数学或矢量,那么std :: vector更合适。
答案 3 :(得分:1)
这是对运动答案的评论。我把它写成答案,可以格式化代码。
这是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;
}
答案 4 :(得分:1)
最长的时间我同意这里的大部分答案。然而,就在今天,它让我觉得为什么在void SetCommsWrite(short nAddress, float fValue)
{
static BYTE parms[] = VTS_I2 VTS_R4 ;
InvokeHelper(0x136, DISPATCH_METHOD, VT_EMPTY, NULL, parms, nAddress, fValue);
}
void SetCommsWrite(short nAddress, float fValue, COleDispatchDriver & driver)
{
static BYTE parms[] = VTS_I2 VTS_R4;
driver.InvokeHelper(0x136, DISPATCH_METHOD, VT_EMPTY, NULL, parms, nAddress, fValue);
}
上实际使用std::string
可能更明智。
大多数人都同意,使用其中任何一个都可以正常工作。但通常情况下,文件数据实际上可以是文本格式(现在更常见的是XML已成为主流)。这使得在调试器变得相关时可以很容易地在调试器中查看(并且这些调试器通常会让您无论如何都可以导航字符串的字节)。但更重要的是,许多可用于字符串的现有函数可以很容易地用于文件/二进制数据。我发现自己编写了多个函数来处理字符串和字节数组,并意识到这一切都是毫无意义的。
答案 5 :(得分:0)
就可读性而言,我更喜欢std :: vector。在这种情况下,std :: vector应该是默认容器:意图更清晰,正如其他答案已经说过的那样,在大多数实现中,它也更有效。
有一次我确实更喜欢std :: string而不是std :: vector。让我们看一下C ++ 11中移动构造函数的签名:
string (string&& str) noexcept;
那次我真的需要一个noexcept移动构造函数。 std :: string提供它而std :: vector不提供它。
答案 6 :(得分:-1)
如果您只想存储二进制数据,可以使用bitset
优化空间分配。否则请转到vector
,因为它更适合您的使用。
答案 7 :(得分:-1)
比较这2并选择你自己哪个更具体。两者都非常强大,使用STL算法......选择自己对你的任务更有效
答案 8 :(得分:-2)
我个人更喜欢std :: string,因为当我希望我的二进制缓冲区恢复为C兼容形式时,string :: data()对我来说更直观。我知道向量元素保证连续存储,在代码中执行此操作感觉有点令人不安。
这是个人开发人员或团队应该为自己制定的风格决策。