我想在 C++(gcc) 中存储一个表,我事先不知道它的大小,它将实时决定使用哪种结构?
5 回答
制作用于表中记录的结构的向量:
vector<MyRecord> v;
您可以使用以下方法添加记录(MyRecord 类型的对象):
v.push_back(record);
如果您的意思是用于大多数目的的数组,std::vector
或者std::deque
是您正在寻找的数组。
std::vector<ClassOrTypeYouNeedToStore> v;
v.push_back(1):
v.push_back(2):
v.push_back(3):
std::cout << "Length of vector " << v.size() << std::endl;
// Before C++11
for (std::vector<int>::iterator it = v.begin(); it != v.end(); it++) {
std::cout << "Next element is " << *it << std::endl;
}
// C++11+
for (auto it = v.begin(); it != v.end(); it++) {
std::cout << "Next element is " << *it << std::endl;
}
这取决于您需要存储什么以及会有所不同。如果列是固定的并且具有不同的类型,并且您希望能够动态地插入和删除行,您可能需要 a std::vector<std::tuple<T,U,V>>
(或者代替 a tuple
,您可以使用某种结构)。
如果列是固定的但都是相同的类型,std::vector<std::array<T,N>>
请试一试。
如果行数和列数是固定的并且类型相同,那么试试std::array<std::array<T,N>,M>
.
如果行数和列数是固定的,但每列的类型不同,std::array<std::tuple<T,U,V>,N>
应该适合你。
如果您希望列数也有所不同,那么您将希望内部类型是std::vector
某种类型的。
通常在这种情况下,我会使用std::vector
.
size_t rsz = 4;
size_t csz = 4;
std::vector<double> table(rsz*csz, 0.0);
for (size_t i = 0; i < rsz; i++) {
for (size_t j = 0; j < csz; j++) {
table[i*csz+j] = i * 10 + j;
}
}
我更喜欢一维向量,自己做偏移算术。它可以防止您的辅助功能过度专业化。
如建议的那样,您可以使用vector<vector<CellType>>
, vector<RowType>
,或者,如果“大小”是指可以使用的“行数” vector<array<RowSize, CellType>>
(我最喜欢的解决方案)。
数组具有恒定长度(性能、内存占用、内存对齐)的优势,在此解决方案中,您可以获得与关系数据库相同的灵活性。