我目前使用
std::vector<std::vector<std::string> > MyStringArray
但我在这里已经阅读了几条评论,这些评论不鼓励在效率方面使用嵌套向量
不幸的是,我还没有看到嵌套向量的替代方法的示例,如下所示。
答案 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)
最有效的方法可能是让字符串在内存中连续(由空终止符分隔),并且每个字符串都有连续的引用数组,另一个每个数组的连续引用数组。
这是为了维护位置并有效地帮助使用缓存,但它最终取决于您访问数据的方式。