Val*_*ron 9 c++ initialization vector deserialization
我很难让我的脑袋围绕如何初始化矢量矢量.
typedef vector <vector <vector <vector <float >>>> DataContainer;
我希望这符合
level_1 (2 elements/vectors)
   level_2 (7 elements/vectors)
      level_3 (480 elements/vectors)
         level_4 (31 elements of float)
Run Code Online (Sandbox Code Playgroud)
解决要素不是问题.这应该像一样简单
dc[0][1][2][3];
Run Code Online (Sandbox Code Playgroud)
问题是我需要在文件中填写无序的数据,以便连续的项目需要放置
dc[0][3][230][22];
dc[1][3][110][6]; //...etc
Run Code Online (Sandbox Code Playgroud)
所以我需要事先初始化V的V值.
我是在哄自己还是这么简单
for 0..1
    for 0..6
        for 0..479
           for 0..30
               dc[i][j][k][l] = 0.0;
Run Code Online (Sandbox Code Playgroud)
它似乎不应该工作.不知何故,必须首先初始化顶层向量.
任何帮助赞赏.我相信这一定比我想象的要简单.
Kar*_*tel 20
如果提前知道存储的大小,请不要使用嵌套向量,即有一个特定的原因,例如第一个索引的大小必须为6,并且永远不会改变.只需使用普通数组.更好的是,使用.这样,您可以获得拥有普通数组的所有好处(当您进行多维时节省大量空间),以及实现真实对象实例化的好处.boost::array
如果您的存储必须是矩形,请不要使用嵌套向量,即您可以调整一个或多个维度的大小,但每个"行"在某个点上的长度必须相同.使用.这样,你记录"这个存储是矩形的",节省了大量的空间,仍然能够调整大小,拥有真实对象的好处等.boost::multi_array
问题std::vector在于它(a)意味着可以调整大小,并且(b)只要它们是正确的类型,就不会轻易关心它的内容.这意味着如果你有一个vector<vector<int> >,那么所有的"行向量"必须保持它们各自的单独的簿记信息 - 即使你想要强制它们的长度都相同.这也意味着它们都管理单独的内存分配,这会损害性能(缓存行为),并且由于std::vector重新分配的方式而浪费更多空间.boost::multi_array设计时可能需要调整大小,但不会通过追加元素(行,二维数组/面,三维数组/等)来不断调整大小.std::vector旨在(可能)浪费空间,以确保操作不慢.boost::multi_array旨在节省空间并将所有内容整齐地整理到内存中.
那说:
是的,在索引向量之前,您需要做一些事情.std::vector不会神奇地导致索引弹出,因为你想在那里存储东西.但是,这很容易处理:
您可以先使用适当的零值初始化向量,然后使用(size_t n, const T& value = T())构造函数替换它们.那是,
std::vector<int> foo(10); // makes a vector of 10 ints, each of which is 0
Run Code Online (Sandbox Code Playgroud)
因为"default-construct"int的值为0.
在您的情况下,我们需要通过创建具有适当大小的子向量并让构造函数复制它们来指定每个维度的大小.这看起来像:
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))));
Run Code Online (Sandbox Code Playgroud)
也就是说,未命名的d1是由大小31构成的,它用于初始化默认值d2,用于初始化默认值d3,用于初始化result.
还有其他方法,但如果你只想要一堆零开始,它们就会更加笨拙.如果你打算从文件中读取整个数据集,但:
您可以使用.push_back()附加到矢量.d1在最里面的循环之前做一个空,在其中重复.push_back()填充它.在循环之后,.push_back()将结果放在d2下一个最内层循环之前创建的结果上,依此类推.
您可以预先调整矢量大小.resize(),然后正常索引(最多调整大小).
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           11687 次  |  
        
|   最近记录:  |