【问题标题】:Assigning to vector of char[8]分配给 char[8] 的向量
【发布时间】: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&lt;char[8]&gt;,但无法为其分配任何内容。如何至少使最后一行(即x.assign(b, b+2))起作用?

非常感谢您的帮助!

【问题讨论】:

  • std::vector&lt;std::string&gt; x;
  • 数组非常愚蠢。它们是 60 年代和 70 年代问题的优雅解决方案,但今天它们出现了裂痕。由于您要存储字符串,请考虑std::string。如果已经消除,请考虑使用std::array&lt;char, 8&gt;
  • 谢谢!当然,这是一个显而易见的解决方案。我所有的字符串都是 8 个字符长,所以我认为使用 char[8] 会更有效。有可能还是 std::string 路由是唯一的方法?
  • @S.V std::vector&lt;std::string&gt; x; 将是最自然的替代品。如果您通过分析和基准测试发现它很慢,您可以使用std::vector&lt;std::array&lt;char, 8&gt;&gt; x;,但您不能使用字符串文字。还有std::vector&lt;std::string_view&gt; x;,但这会带来对象生命周期问题。

标签: c++ arrays vector char


【解决方案1】:

您不能拥有std::vector&lt;char[8]&gt;,因为char[8] 不满足std::vector 对值类型的要求。具体来说,值类型要求是Erasable,char[8]没有默认分配器。

您可以改用std::vector&lt;std::array&lt;char,8&gt;&gt;std::array&lt;char,8&gt; 不仅是可擦除的,而且是可分配的。

【讨论】:

  • 不知何故,std::vector&lt;std::array&lt;char,8&gt;&gt; y; char c[2][8] = {"7777777", "8888888"}; y.assign(c, c+2); 不起作用。我收到以下错误:error: no viable overloaded '='error: no matching constructor for initialization of 'std::array&lt;char, 8&gt;'。虽然,std::vector&lt;std::string&gt; 似乎有效。
  • @S.V std::array 不能像普通数组那样从字符串文字创建。您可以使用如下所示的辅助函数:stackoverflow.com/a/33484394/2079303
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-14
  • 2021-08-13
  • 1970-01-01
相关资源
最近更新 更多