【问题标题】:Changing an m x 3 array into an stl container?将 m x 3 数组更改为 stl 容器?
【发布时间】:2011-01-19 20:43:36
【问题描述】:

我有一个数组:

const string ARRAY[][3] = {
    {"Kolkata","Mumbai","218"},
    {"Kolkata","New Delhi","316"},
    ...
    {"Mumbai","Chennai","715"},
    {"Chennai","Bangalore","516"},
};

这是存储整个表格的便捷方式,因为我知道我有多少行。然而,在未来,数据需要从文件中读取,任何人都可以并且将被编辑。

我想创建一个结构,类似于:

typedef struct row {
    string col1;
    string col2;
    string col3;
} row_t;

然后创建一个vector<row_t>。这是一个好主意吗?有没有更简单的方法使用 stl 容器来做到这一点?我还想过创建一个足够大的表以持续一段时间(行数不会经常变化),但感觉不对..

谢谢!

【问题讨论】:

  • 你的默认构造函数是不必要的(它不会做任何隐式定义的默认构造函数会做的事情)。以下划线开头的名称在许多情况下是为实现保留的(complex rules 指定何时允许使用它们以及何时不允许使用它们)。最好避免在名称前加下划线。

标签: c++ arrays struct stl


【解决方案1】:

最直接的转换是在结构中使用数组:

struct row {
    std::string data[3];
};

std::vector<row> v;

或者你可以使用std::/std::tr1::/boost::array类模板:

std::vector<std::array<std::string, 3> > v;

如果您要为每个元素使用单独的数据成员,如您在示例中所示,您应该为它们指定有用的名称,而不仅仅是将它们命名为“col#”。

【讨论】:

  • 不幸的是,boost 不是一个选项。不过,我确实看过它,那会更容易。
  • @Sagar:那个类模板最多也就100行代码。您可以轻松地从 Boost 中提取它和/或非常轻松地使用相同的接口实现您自己的版本。
【解决方案2】:

这是个好主意。您只需要提供一个 operator>> 来从文件中读取就可以了。但是,我真的不明白你在那里进行的 typedef struct{} 东西——C++ 从来没有要求过。

【讨论】:

  • 从文件中读取根本不是问题。至于结构,它只是为了更容易处理行。我不确定您所说的“C++ 从未要求过”是什么意思..
  • @Sagar:这是 C 的遗留问题,本质上是不必要的。 struct row { ... }; 足以定义一个名为 row 的类型。
【解决方案3】:

这种方法很好,假设列数永远不会改变。您可以创建一个向量向量,或修改您的结构以包含一个向量。

【讨论】:

    【解决方案4】:

    您很可能会使用聚合向量。

    vector < vector < string > > Array;
    

    然后您可以根据需要调整行/列的大小。如果由于每行的条目数固定,该结构对您更方便,您可以轻松使用您的建议。

    vector < row_t > Array;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      相关资源
      最近更新 更多