在矢量中查找信息

Finding information in a vector?

本文关键字:查找 信息      更新时间:2023-10-16

在C++中,我知道为了创建动态数组,需要使用向量。然而,当我需要找到我放入向量中的信息时,我遇到了一个问题。

例如:比方说,我有一个简单的矢量,它存储了一个人的名字和写的一条小消息。在矢量中,我如何找到比尔的位置。

当我发布这个问题时,我还试图了解如何在PHP中做到这一点。

你确实很困惑。让我试着帮你。

有一件事可能会让你感到困惑:std::vector不是几何向量。它只是内存中连续的同一类型的数据序列。所以它就像一个数组。

a) 根据变量确定矢量的大小。例如,如果我使用的是一个数组,它看起来像array[x][y](I知道这样做是不可能的)。如何使用矢量

std::vector基本上是一个自动管理的动态数组。

这意味着它是内部的一个数组,但它是由代码管理的,当您试图添加超过当前容量的数据时,代码会确保数组增长(变得更大)。

实际上,std::vector是一个类模板。这意味着它不是一个真正的类,它是编译器用来为自己生成一个真正类的代码。如果我说

std::vector<int> my_ints; // this is a vector of ints

这个向量只能容纳int。然后:

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命令来存储值特定点内的变量。如果我使用的是数组它就像array[x][y]+=q。其中x和y是数组中的点并且q是值。

您不使用push_back()在两个值之间添加值,而是使用insert()。

syntaxe数组[x][y]+=q肯定不会起到您所描述的作用。它将把q加到位置数组[x][y]的值上。

数组与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;

但是,如果希望数组大小由变量决定,则不能使用此选项。维度必须是编译时间常数。