【问题标题】:3D Vector of struct emplace_backstruct emplace_back 的 3D 向量
【发布时间】:2014-01-26 19:50:37
【问题描述】:

这行不通。原因对我来说很神秘。

PS:使用 C++11

http://ideone.com/elopRc

#include <iostream>
#include <vector>
#include <string>

using namespace std;

int main() {
    struct MyStruct {
        size_t some_num;
        char some_char;
        bool some_bool;
        MyStruct* some_ptr;
    };

    vector<vector<vector<MyStruct>>> three_d_struct_v;

    size_t max_i = 100;
    size_t max_j = 10;
    size_t max_k = 10;

    for(size_t i = 0; i < max_i; i++) {
        for(size_t j = 0; j < max_j; j++) {
            for(size_t k = 0; k < max_k; k++) {
                three_d_struct_v.emplace_back(k, 'x', false, nullptr);
            }
        }
    }


    return 0;
}

【问题讨论】:

  • three_d_struct_v 不是MyStructs 的向量,它是向量的向量。
  • 老实说,我会使用矢量地图的地图并称之为好。 See it live。甚至是地图的地图,但疯狂必须在某个地方结束。
  • @WhozCraig 您的 ideone 运行时间为 2000 万次:3.59 内存:555008(内存不足)其中接受的答案时间:2.87 内存:3468
  • @BHare 2000 万什么,到底是什么?我对此没有任何问题,ideone.com 也没有,所以我不知道您添加了哪些附加要求。使用最有效的方法,但在 555008 和 oom 上,我认为您的实现不太可能是正确的。我使用了unordered_map,因为排序有点毫无意义。
  • 我将 i 设置为 800,000,将 j 和 k 设置为 5. 20,000,000 百万个元素。

标签: c++ c++11 vector multidimensional-array emplace


【解决方案1】:

这里,three_d_struct_vvector&lt;vector&lt;vector&lt;MyStruct&gt;&gt;&gt; 类型,即vector&lt;vector&lt;MyStruct&gt;&gt;vector,因此您需要添加vector&lt;vector&lt;MyStruct&gt;&gt; 类型的元素(对于嵌套维度也是如此)。但是,在您的代码中,您将直接添加 MyStruct 类型的元素。

您需要更改为:

for(size_t i = 0; i < max_i; i++) {
    vector<vector<MyStruct>> v1;
    for(size_t j = 0; j < max_j; j++) {
        vector<MyStruct> v2;
        for(size_t k = 0; k < max_k; k++) {
            MyStruct a = {k, 'x', false, nullptr};
            v2.emplace_back(move(a));
        }
        v1.emplace_back(move(v2));
    }
    three_d_struct_v.emplace_back(move(v1));
}

查看ideone 了解完整代码。

【讨论】:

  • 虽然我现在明白原来的错误是什么,但我仍然得到另一个错误:ideone.com/elopRc
  • 您可能希望将所有 v1.emplace_back(x) 实例替换为 v1.emplace_back(std::move(x)) 以避免不必要的复制。
猜你喜欢
  • 1970-01-01
  • 2021-10-12
  • 2021-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-22
  • 2018-08-22
相关资源
最近更新 更多