首页 > 解决方案 > 有一个 std::vector 相关的概念问题

问题描述

我一直在使用向量,但只是为了方便调整它们提供的大小。今天,我意识到我并不完全理解 std::vector 。我已经创建了我的程序所需的数据结构。它被定义为:

vector<vector<string>, int> memtable;
// the idea is that an element of this vector is something like {[var_name, var_type], loc}
// where the braces and parentheses just refer to a box

我想要一个 memtable,用于存储有关变量及其位置的信息。
我使用向量的实现是一个可接受的解决方案吗?我能够正确地可视化容器吗?
如何构造该向量的元素并将其插入向量中(例如使用vector.push_back())?

详细说明我的数据结构,我正在创建一个存储变量、它的类型和它的位置的内存表。由于 std::vector 在其类型声明中只允许两种类型vector<type1, type2>,我在第一个代码片段中使用了解决方案。下面的解决方案也有效吗?

vector<string [2], int> memtable; // does this match this container structure -> {[var_name, var_type], loc}

标签: c++vector

解决方案


std::vector 有两个模板参数,第一个 (T) 是强制的(包含的值的类型),第二个(分配器)(非强制)用于为第一个 (T) 提供内存的分配器类型. 请注意,向量是类型 T 的值序列(is 不是类型序列)。

类型 T 的先决条件是它应该是 CopyAssignable 和 CopyConstructable,并且取决于操作,也是可擦除的。std::vector 实际上几乎就像一个 T 类型的数组,不同之处在于它的大小预先不知道,因此它通常嵌入一个指向实际数组的指针,并通过执行间接性。

在您的情况下,您想要定义一个适合您要求的类型 T :

struct MyType {
  std::string name_;
  std::string type_;
  int location_;
};

...或者任何代表你的类型的东西。请注意,上述类型满足要求是因为包含的类型满足所有要求(*见注)。您的向量将变为:

std::vector<MyType> myVector;

...或者您可以通过提供 typedef 来“典型化”它:

typedef std::vector<MyType> MyVector;
MyVector myVector; //instantiate my type.

注意:如果您创建的类型包含指针(间接),它仍然符合要求(因为指针是内置类型),但如果它们自己管理指向的内存(如在分配和复制期间)构造源对象最终超出范围并删除现在包含在目标中的内存(即存在于容器中))。在这种情况下,您需要提供/实现必要的成员函数。幸运的是你的不需要。

最后,您可能还在寻找 tuple 的向量其中 tuple 表示类型序列(而不是值序列)。因此,您也可以这样做来实现相同的目的:

typedef std::vector<std::tuple<string,string,int>> MyVector;
MyVector myVector;
myVector.push_back(std::make_tuple("Hallo", "Apple", 20));

推荐阅读