在 C++ 中,我知道为了创建动态数组,您需要使用向量。但是,当我需要查找放入向量中的信息时,我遇到了问题。
例如:假设我有一个简单的向量,它存储一个人的名字和一条写的小消息。在向量中,我如何找到比尔所在的位置。
当我发布这个问题时,我还试图了解如何在 PHP 中执行此操作。
确实,你很困惑。让我试着帮助你。
一件事可能会让您感到困惑: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()。
语法 array[x][y] += q 肯定不会像你描述的那样做。它会将 q 添加到位置数组 [x] [y] 处的值。
数组不同,std::vector
因为它们的大小是固定的。当数组存在时,数组的所有元素都存在。当您std::vector
使用其默认构造函数创建 a 时,它是空的。它不包含任何元素,因此您不能索引任何元素。
但是,std::vector
确实有一个采用初始大小的构造函数。如果您将单个int
参数传递给std::vector
构造函数,它将默认初始化那么多元素。例如:
std::vector<int> v(10); // Will have 10 ints
如果你想要一个二维数组的等价物,那么你需要一个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;
但是,如果您希望数组大小由变量确定,则不能使用它。维度必须是编译时常量。