在C ++中,我理解为了创建动态数组,您需要使用向量。但是,当我需要找到放在矢量中的信息时,我遇到了问题。
例如: 让我们说我有一个简单的向量,存储一个人的名字和写的小消息。在向量中,我如何找到Bill所在的位置。
当我发布this question时,我也试图了解如何在PHP中执行此操作。
答案 0 :(得分:3)
有一件事可能让你困惑:std :: vector不是几何向量。它只是在内存中连续的相同类型的数据序列。所以它就像一个数组。
a)根据变量确定向量的大小。例如,如果 我正在使用一个数组,它看起来像数组[x] [y](我 知道这样做是不可能的。我怎么用矢量
来做这个
std :: vector基本上是一个自动管理的动态数组。
这意味着它是一个内部数组,但它由代码管理,当您尝试添加的数据超过当前容量可以容纳的数据时,它将确保数组增长(变大)。
实际上,std :: vector是一个类模板。这意味着它不是一个真正的类,编译器将使用它来生成一个真正的类。如果我说
std::vector<int> my_ints; // this is a vector of ints
此向量只能保存整数。然后:
std::vector<std::string> name_list;
这个持有std :: string对象。
正如我所说,内部,它是动态管理数组的唯一代码。您可以将之前的示例视为如此:
class
{
unsigned long size; // count of elements contained in this container
unsigned long capacity; // count of elements that the memory allocated by the array can hold
int* array; // array containing the values, created using new, destroyed using delete
}
my_ints;
这是一个过于简单的内部视图,所以不要假设它完全一样,但它可能有用。
现在,当您添加值时,该值将复制到数组的内存中,尚未使用的元素(例如通过push_back())或写入已存在的元素(使用insert()例子)。
如果你添加一个值并且向量的容量不足以容纳所有值,那么向量将自动增长:它将创建一个更大的数组,将其当前值复制到其中,同时复制其他值,然后删除之前的数组。 理解这一点很重要:如果向量增长,那么你不能认为它的数据总是在内存中的同一个地址,因此指向它的数据不能被信任。
b)第二,如何使用push back命令存储值 特定点内的变量。如果我使用的是数组 它就像数组[x] [y] + = q。其中x和y是数组中的点 和q是值。
您不使用push_back()在两个值之间添加值,而是使用insert()。
语法数组[x] [y] + = q肯定不会按照你的描述进行。它会将q添加到位置数组[x] [y]的值。
答案 1 :(得分:1)
数组与std::vector
不同,因为它们具有固定的大小。当数组存在时,数组的所有元素都存在。使用默认构造函数创建std::vector
时,它为空。它不包含任何元素,因此您无法索引任何元素。
但是,std::vector
确实有一个采用初始大小的构造函数。如果将int
个参数传递给std::vector
构造函数,它将默认初始化许多元素。例如:
std::vector<int> v(10); // Will have 10 ints
如果你想要相当于2D数组,那么你需要一个std::vector<std::vector<T>>
。如果要使用特定大小构造它,则需要如上所述指定外部std::vector
的大小,并将每个元素应初始化的std::vector
传递给它。例如,如果你想要一个10x20矢量:
// This will have 10x20 ints
std::vector<std::vector<int>> v(10, std::vector<int>(20));
存在这些元素之后,您可以像对待数组一样索引它们:
int value = v[x][y];
值得注意的是,C ++ 11引入了std::array
,它具有编译时固定大小。您可以像这样使用它:
std::array<std::array<int, 20>, 10> arr;
但是,如果希望数组大小由变量确定,则不能使用此方法。维度必须是编译时常量。