C++ 结构,类似于 vector 但会自动调整大小

C++ structure, similar to vector but which resizes automatically

我正在编写 "corridor" 中空间细胞生长的模拟。我从一定数量的细胞排成一行开始(即我走廊的 "width"),让它们沿着走廊的 "length" 以随机方式向下生长。因为我需要能够通过走廊上的坐标访问所有单元格,所以我总是使用二维矢量(即元素再次为矢量的矢量)网格并将我的单元格保存在那里。

我现在的问题是,在我当前的模拟中,我不知道我的细胞需要沿着走廊生长多远,即我不知道我的二维网格需要 "length"。 (因为这会随机变化 运行 运行) 为了 "grow" 我的单元格,即将新对象放置到我的网格上,我需要访问特定的网格点,但如果我不知道最大值。需要长度但我无法在开始时启动具有足够长度的向量。

是否有某种结构可以让我通过索引访问每个插槽,就像在向量中一样,但我不需要从一开始就确定它有多大? (我知道使用 vector 我不需要从一开始就指定长度,但我并不总是使用追加,因为有时网格中存在间隙所以我需要从一开始就访问特定的索引) .

很抱歉,如果我提出的问题不够清楚,如果您有想法或问题不清楚,请告诉我。谢谢!

Is there some kind of structure where I can access each slot via an index, just like in vector, but where I don't need to set out from the start how big it is?

是的。 std::vector 就像那个结构。您可以调用 push_back 将大小增加一,或调用 resize 将大小增加任意数量。初始化时不需要知道大小。

but I don't always use append

那就用resize代替。

你可以这样写:

#include <vector>
#include <iostream>

struct foo { 
    std::vector<int> data;
    int& operator[](size_t i){
        if ( data.size() < i) data.resize(i-1);
        return data[i];
    }
};

int main() {
    foo f;
    f[100] = 10;
    std::cout << f[100];
}

但是,我不建议实际使用它。 std::vector 可让您细粒度地控制分配发生的时间和地点。您可以使用 resize and/or reserve 来确保向量具有足够的元素/容量。另一方面,上面的内容会导致您在意想不到的地方调整矢量的大小。 push_back 是添加元素,而通过 []at 访问元素应该访问元素或失败。

您可以做的是保留足够的 space 然后 push_back 您将拥有的元素数量:

 std::vector<int> foo;
 // dont know how many elements exactly, but it will be less than 1000
 foo.reserve(1000);
 while (some_condition()) foo.push_back(something());