在内存中操作std :: strings的2D动态数组的最有效方法是什么?

时间:2011-08-03 01:10:11

标签: c++ string vector

我目前使用

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

但我在这里已经阅读了几条评论,这些评论不鼓励在效率方面使用嵌套向量 不幸的是,我还没有看到嵌套向量的替代方法的示例,如下所示。

3 个答案:

答案 0 :(得分:3)

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

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]

答案 1 :(得分:1)

鉴于您所说的设计目标,对我来说这似乎是一个合理的设计。请注意,您应该避免调整外部矢量大小的操作;这些可能会导致整个结构中所有数据的深层副本(这可能会在C ++ 0x STL实现中有所缓解)。

答案 2 :(得分:0)

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

这是为了维护位置并有效地帮助使用缓存,但它最终取决于您访问数据的方式。