c++ - vector 初始化 vector

标签 c++ vector initialization deserialization

我很难全神贯注于如何初始化 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/

相关文章:

initialization - 用 Go 中的类型声明替换包装结构

c++ - 是否需要定义虚拟析构函数?

C++ Eigen 稀疏矩阵乘法比 python scipy.sparse 慢得多

c++ - 对如何更新 Mingw 有一点帮助吗?

c++ - 将 vector<unique_ptr<Derived>> move 到 vector<unique_ptr<Base>>

ios - 类实例的所有存储属性必须在从初始化器抛出之前初始化

c++ - 使用统一初始化初始化对象和指针对象不起作用

C++ Windows 凭据提供程序错误屏幕

c++ 将 vector 中出现 n 次的所有元素作为 vector 返回

C++ 将 vector<string> 元素传递给函数导致 SIGSEGV 崩溃