【问题标题】:Efficient way to create array of string创建字符串数组的有效方法
【发布时间】:2019-01-16 09:00:59
【问题描述】:

我需要创建一个更有效的字符串数组。

1.std::array<std::string, 3>arr  {"aa", "bb", "cc"};
2.std::vector<std::string> arr = {"aa","bb","cc"};
3.string arr[3]                = {"aa", "bb", "cc"};

注意:在我的情况下,所有字符串(aa,bb,cc)在初始化期间都是固定的。 如果有的话,请建议任何其他方式。

【问题讨论】:

  • 您是否需要调整数组的大小?将其作为参数传递?
  • 不,这是在编译期间修复的。但我需要从固定数组中搜索字符串,即在我们的例子中为 aa,bb,cc 并返回搜索给调用者。
  • @newcpp 如果大小在编译时已知并且在运行时从未更改,请使用std::array。否则,请使用std::vector

标签: c++ string c++11 vector stdarray


【解决方案1】:

std::array&lt;std::string, 3&gt; arr{"aa", "bb", "cc"};string arr[3] = {"aa", "bb", "cc"}; 的性能应该相同。 std::array 将数组大小烘焙到类型中,因此它在传递时不会降级为大小未知的指针(只需确保它通过引用传递以避免复制),并且具有更多 C++ 实用程序方法,但除此之外有与 C 数组相同的性能和行为特征,所以它可能是要走的路。

如果你可以使用 C++14,可以通过制作字符串 std::string literals 来进行非常小的改进,这允许它们从 C 风格的字符串转换为 std::string 的效率稍高一些(大小烘焙in 在编译时,因此它可以使用已知长度的构造函数,而不是必须首先扫描 NUL 终止符的构造函数。

using namespace std::string_literals;

std::array<std::string, 3> arr{"aa"s, "bb"s, "cc"s};  // s suffix makes them string literals

【讨论】:

  • 我使用的是 c++11,所以我不能使用 std::string_literals;除了 {std::string(aa),..,..}
  • @newcpp:文字大部分等同于为std::string 使用指针+长度构造函数,因此"aa"s 可以更冗长地写为std::string("aa", 2)(但这意味着在长度上进行硬编码每个字符串)。 std::string("aa") 根本没有给你带来任何好处(它只是明确地写出当你将 char* 分配给 std::string 时隐式发生的事情)。
【解决方案2】:

我会去第三个。简单,std::arraystd::vector 没有编译时间或运行时间开销

string arr[3]                = {"aa", "bb", "cc"};

【讨论】:

  • std::array 应该没有超出普通 C 样式数组的开销,至少在运行时是这样。考虑到在编译时实现模板的成本,它可能会稍微减慢编译速度,但除此之外,它的行为应该相同。
猜你喜欢
  • 2020-12-10
  • 1970-01-01
  • 2020-07-12
  • 1970-01-01
  • 1970-01-01
  • 2015-07-05
  • 2015-11-11
  • 2012-12-18
  • 2018-12-16
相关资源
最近更新 更多