在内存中操作std::string的二维动态数组的最有效方法是什么?
What is the most efficient way to manipulate a 2D dynamic array of std::strings in memory?
我目前使用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终止符分隔),并且有连续的数组对每个字符串的引用,以及另一个连续的数组对每个数组的引用。
这是为了维护局部性并帮助有效地使用缓存,但它最终取决于您如何访问数据。
相关文章:
- std::向量与传递值的动态数组
- 将数组动态分配到具有指针参数的函数中
- 我可以以某种方式使我的矢量/数组动态更改装置数量吗?
- 使用 new: "potentially uninitialized pointer"将对象数组动态分配给指针
- 为什么C 没有方便的方式来为多维数组动态分配内存
- 如何制作具有动态大小的数组?动态数组的一般用法(可能还有指针)
- c++中的数组动态内存分配
- 多维数组动态分配的内存图
- 如何在 c++ 中使用 2-D 固定数组为 4-D 数组动态分配内存
- C++ 我在数组/动态内存方面遇到了一些问题
- C++ 中从数组动态强制转换
- C++中高维数组动态内存分配的正确方法.
- 从 C++ 结构中包含的指针数组动态分配和访问内存
- 对象数组动态内存分配
- 为二维数组动态分配内存时出错
- 如何将2d数组动态分配给结构
- 为结构数组c++动态分配内存
- 将数组动态添加到多维数组
- 类中的类数组-动态数组(c++)有问题
- 分配对象数组动态冻结