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());
我正在编写 "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());