声明具有特定大小并插入元素的 vector<vector<pair<int, int>>?

新手上路,请多包涵

我想表示一个图形数据结构,我在 c++ stl 中使用对向量的向量。例子:

 vector<vector<pair<int, int>>> G;

现在我可以做, G[u].push_back(make_pair(v, w));

问题:我需要指定这个数据结构的大小。如果我不尝试将元素推送到此数据结构时,我会遇到分段错误。如果我确实给出如下尺寸:

 vector< vector<ii> > adj(10, std::vector<ii>(10));

现在的问题是前 10 对向量被初始化为零。如果我现在推回一个元素,它会被推到第 11 个位置。前 10 个为 0。我不想这样做。我想按我需要的顺序插入元素。一个片段让您了解我正在尝试做的事情:

  for(int i=0;i<E-1;i++)
        {
            cin >> p >> q >> l;
            adj[p].push_back(ii(q, l));
            adj[q].push_back(ii(p, l));
        }

上面的输出将是 10 个零,后跟推送的值。有什么办法可以解决这个问题?

原文由 Abhishek Kusnoor 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 425
1 个回答

不知何故,您自相矛盾:创建向量时,您可以在构造函数中传递元素的数量,也可以从空向量开始,然后将要在向量中包含的元素推入。如果您从 10 号开始,然后再推 10 号,则有 20 号。他们的方法是使用

std::vector<T> vect(10);
for (size_t i=0;i<10;i++){
    vect[i] = whatever;
}

或者

std::vector<T> vect;
for (size_t i=0;i<10;i++){
     vect.push_back(whatever);
}

也许您将向量的大小与其容量混淆了。您可以通过以下方式设置:

 std::vector<T> vect;
vect.reserve(10);
for (size_t i=0;i<10;i++){
     vect.push_back(whatever);
}

对于您的向量向量,您必须确保在开始将元素推入其中之前,该索引处有一个向量:

 std::vector<std::vector<T>> mat;
for (size_t i=0;i<10;i++){
    mat.push_back(std::vector<T>());
    for (size_t j=0;j<10;j++){
        mat[i].push_back(whatever);
    }
}

原文由 463035818_is_not_a_number 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题