【发布时间】:2019-10-14 16:18:53
【问题描述】:
如何将某些内容分配给std::vector<char[8]>?
#include <vector>
void test(void)
{
std::vector<char[8]> x; // works
x.push_back("7777777");
//
// error: array 'new' cannot have initialization arguments
// error: object expression of non-scalar type 'char [8]'
// cannot be used in a pseudo-destructor expression
char a[8] = "7777777";
x.push_back(a);
//
// error: array 'new' cannot have initialization arguments
// error: object expression of non-scalar type 'char [8]'
// cannot be used in a pseudo-destructor expression
char b[2][8] = {"7777777", "8888888"};
x.assign(b, b+2);
//
// error: static_assert failed "type is not assignable"
// error: array 'new' cannot have initialization arguments
}// end of function
看起来可以创建std::vector<char[8]>,但无法为其分配任何内容。如何至少使最后一行(即x.assign(b, b+2))起作用?
非常感谢您的帮助!
【问题讨论】:
-
std::vector<std::string> x; -
数组非常愚蠢。它们是 60 年代和 70 年代问题的优雅解决方案,但今天它们出现了裂痕。由于您要存储字符串,请考虑
std::string。如果已经消除,请考虑使用std::array<char, 8> -
谢谢!当然,这是一个显而易见的解决方案。我所有的字符串都是 8 个字符长,所以我认为使用
char[8]会更有效。有可能还是std::string路由是唯一的方法? -
@S.V
std::vector<std::string> x;将是最自然的替代品。如果您通过分析和基准测试发现它很慢,您可以使用std::vector<std::array<char, 8>> x;,但您不能使用字符串文字。还有std::vector<std::string_view> x;,但这会带来对象生命周期问题。