在内存中操作std::string的二维动态数组的最有效方法是什么?

What is the most efficient way to manipulate a 2D dynamic array of std::strings in memory?

本文关键字:数组 动态 二维 方法 有效 是什么 操作 内存 std string      更新时间:2023-10-16

我目前使用

std::vector<std::vector<std::string> > MyStringArray

但是我在这里读到了一些关于SO的评论,这些评论出于效率的考虑不鼓励使用嵌套向量。
不幸的是,对于这种情况,我还没有看到嵌套向量的替代方法的例子。

这是一个简单的动态二维数组,列号在运行时可配置:

class TwoDArray
{
  size_t NCols;
  std::vector<std::string> data;
public:
  explicit TwoDArray(size_t n) : NCols(n) { }
  std::string & operator()(size_t i, size_t j) { return data[i * NCols + j]; }
  const std::string & operator()(size_t i, size_t j) const { return data[i * NCols + j]; }
  void set_number_of_rows(size_t r) { data.resize(NCols * r); }
  void add_row(const std::vector<std::string> & row)
  {
    assert(row.size() == NCols);
    data.insert(data.end(), row.begin(), row.end());
  }
};

用法:

TwoDArray arr(5); // five columns per row
arr.set_number_of_rows(20);
arr(0, 3) = "hello";
arr(17,2) = "world";

这只是一个完全任意和随机的例子。你真正的类显然必须包含适合你所做的接口方法;或者你可以决定根本不使用包装类,直接处理裸向量。

主要特点是通过(i,j)的二维访问操作符,它取代了嵌套向量的[i][j]

考虑到您陈述的设计目标,我认为这似乎是一个合理的设计。注意,你应该避免调整外部向量大小的操作;这可能会导致整个结构中所有数据的深度拷贝(这可能会在c++ 0x STL实现中有所缓解)。

最有效的方法可能是让字符串在内存中连续(用null终止符分隔),并且有连续的数组对每个字符串的引用,以及另一个连续的数组对每个数组的引用。

这是为了维护局部性并帮助有效地使用缓存,但它最终取决于您如何访问数据。