我很难全神贯注于如何初始化 vector 的 vector 。
typedef vector< vector < vector < vector< float >> >> 数据容器;
我希望它符合
level_1 (2 elements/vectors)
level_2 (7 elements/vectors)
level_3 (480 elements/vectors)
level_4 (31 elements of float)
解决元素问题不是问题。这应该像这样简单
dc[0][1][2][3];
问题是我需要用文件中乱序的数据来填充它,这样连续的项目就需要像这样放置
dc[0][3][230][22];
dc[1][3][110][6]; //...etc
所以我需要事先初始化V的V。
我是在把自己吓坏还是就这么简单
for 0..1
for 0..6
for 0..479
for 0..30
dc[i][j][k][l] = 0.0;
这似乎不应该起作用。必须首先初始化顶级 vector 。
感谢任何帮助。我相信这一定比我想象的要简单。
最佳答案
如果提前知道您的存储大小,请不要使用嵌套 vector ,即有一个特定原因 为什么第一个索引的大小必须为 6,并且永远不会改变。只需使用一个普通数组。更好的是,使用
boost::array
.这样,您将获得拥有普通数组的所有好处(在多维时节省大量空间),以及拥有真实对象实例化的好处。如果您的存储必须矩形,请不要使用嵌套 vector ,即您可以调整一个或多个维度的大小,但每一“行”必须在某些时候是相同的长度。使用
boost::multi_array
.这样,您就可以记录“这个存储空间是长方形的”,节省大量空间,并且仍然能够调整大小、拥有真实对象的好处等。
关于std::vector
的事情是它 (a) 意味着可以调整大小,并且 (b) 丝毫不关心它的内容,只要它们是正确的类型即可。这意味着如果你有一个 vector<vector<int> >
,那么所有的“行 vector ”都必须维护它们自己的关于它们有多长的单独的簿记信息——即使你想强制它们都是相同的长度。这也意味着它们都管理单独的内存分配,这会损害性能(缓存行为),并且由于 std::vector
的方式而浪费更多空间。重新分配。 boost::multi_array
设计时期望您可能想要调整它的大小,但不会通过将元素(行,对于 2 维数组/面,对于 3 维数组等)附加到末尾来不断调整它的大小。 std::vector
旨在(可能)浪费空间以确保操作不慢。 boost::multi_array
旨在节省空间并使内存中的所有内容井井有条。
就是说:
是的,在对 vector 进行索引之前,您确实需要做一些事情。 std::vector
不会神奇地导致索引突然出现,因为你想在那里存储一些东西。然而,这很容易处理:
您可以先使用适当数量的零默认初始化 vector ,然后使用 (size_t n, const T& value = T())
替换它们。构造函数。也就是说,
std::vector<int> foo(10); // makes a vector of 10 ints, each of which is 0
因为“默认构造的”int 的值为 0。
在您的情况下,我们需要通过创建适当大小的子 vector 并让构造函数复制它们来指定每个维度的大小。这看起来像:
typedef vector<float> d1;
typedef vector<d1> d2;
typedef vector<d2> d3;
typedef vector<d3> d4;
d4 result(2, d3(7, d2(480, d1(31))));
也就是一个未命名的d1
由大小 31 构成,用于初始化默认值 d2
, 用于初始化默认 d3
, 用于初始化 result
.
还有其他方法,但如果您只想以一堆零开始,它们就笨拙得多。但是,如果您要从文件中读取整个数据集:
您可以使用
.push_back()
附加到 vector 。清空d1
就在最内层循环之前,您在其中重复.push_back()
填满它。在循环之后,你.push_back()
结果到d2
这是您在下一个最内层循环之前创建的,依此类推。您可以预先使用
.resize()
调整 vector 的大小, 然后正常索引到它(直到你调整到的数量)。
关于c++ - vector 初始化 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4320085/