在向量中查找信息?

时间:2013-02-10 18:31:24

标签: c++

在C ++中,我理解为了创建动态数组,您需要使用向量。但是,当我需要找到放在矢量中的信息时,我遇到了问题。

例如: 让我们说我有一个简单的向量,存储一个人的名字和写的小消息。在向量中,我如何找到Bill所在的位置。

当我发布this question时,我也试图了解如何在PHP中执行此操作。

2 个答案:

答案 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;

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