c++ - 有一个 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}
解决方案
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));
推荐阅读
- google-apps-script - 在排序中的唯一值之间添加空白行或标题
- c - How do I get my if else statements to work in C?
- python - 如何将pip添加到路径
- python - ValueError:数据重叠。在蟒蛇
- javascript - 使用 node.js 对带有嵌套对象的 dynamoDB 进行条件更新
- python - 使用 PANDAS 为 csv 创建空列并写入文件
- r - scale_x_bd - 如何正确设置日期格式
- jquery - JQuery 清除密码类型的输入标记。但在浏览器中显示点
- simulation - 如何使 Federate 对象出现在另一个 Federate 软件中?
- neural-network - 隐藏的神经元如何变得彼此不同?