2

我想在 C++(gcc) 中存储一个表,我事先不知道它的大小,它将实时决定使用哪种结构?

4

5 回答 5

3

制作用于表中记录的结构的向量:

vector<MyRecord> v;

您可以使用以下方法添加记录(MyRecord 类型的对象):

v.push_back(record);
于 2012-12-23T16:51:49.447 回答
1

如果您的意思是用于大多数目的的数组,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;
 }
于 2012-12-23T16:52:00.267 回答
1

这取决于您需要存储什么以及会有所不同。如果列是固定的并且具有不同的类型,并且您希望能够动态地插入和删除行,您可能需要 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某种类型的。

于 2012-12-23T16:54:59.510 回答
0

通常在这种情况下,我会使用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;
  }
}

我更喜欢一维向量,自己做偏移算术。它可以防止您的辅助功能过度专业化。

于 2012-12-23T16:55:22.230 回答
0

如建议的那样,您可以使用vector<vector<CellType>>, vector<RowType>,或者,如果“大小”是指可以使用的“行数” vector<array<RowSize, CellType>>(我最喜欢的解决方案)。
数组具有恒定长度(性能、内存占用、内存对齐)的优势,在此解决方案中,您可以获得与关系数据库相同的灵活性。

于 2012-12-23T16:59:03.030 回答