将元素插入2D矢量

时间:2014-12-02 03:02:36

标签: c++ vector adjacency-list

所以我创建了一个实现邻接列表的类。目前在我的班级定义中,我初始化了两个向量:

vector<vector<int>> adjList;
vector<int> neighbors;

我宣布了两个我计划使用的功能:

bool constructAdjList();
bool insertIntoAdjList(int, int);

让我的头围绕2D矢量变得困难。我知道它本质上是一个向量的向量,但我对如何将一个新值插入其中一个&#34;子向量&#34;感到困惑。例如,我可以使用以下循环在createAdjList中创建一个空的邻接列表:

for (int i = 0; i < numOfValues; i++){
    neighbors.push_back(0);
    adjList.push_back(neighbors);
    neighbors.clear();
}

但是我怎么说,将值5推送到adjList中的第4个向量,这将在我的insertIntoAdjList函数中表示为

insertIntoAdjList(4, 5);

我知道我可以通过说adjList [4] [1]来访问2D向量中的特定值,但是如何将其推到它上面呢?

谢谢!

3 个答案:

答案 0 :(得分:11)

要推动作为另一个向量元素的向量,只需执行此操作

adjList[x].push_back();

答案 1 :(得分:2)

如果最初在向量中没有任何值- 您可以将值推入一个向量,然后将此向量推入2D向量。 例如:

  vector< vector<int> > vt1;
  vector<int> vt2;

  vt2.push_back(value);
  vt1.push_back(vt2);

如果您的载体已经填充,则-

vt1[index].push_back(value);

答案 2 :(得分:1)

这里有几点注释。

只需使用两个成员的构造函数,就可以显着缩短循环次数:

vector<int> neighbors(1, 0); // set to length 1, value is zero
vector<vector<int>> adjList(numOfValues,neighbors); // "outer" vector is numOfValues long
.                                                   // each row is a *COPY* of neighbor

如果你不能在施工时这样做(可能还没有numOfValues),那么我们可以使用更好的循环措辞:

// neighbors object can be reused
neighbors.clear(0);
neighbors.push_back(0);
adjList.reserve(numOfValues); // reserving memory ahead of time will prevent allocations
for (int i = 0; i < numOfValues; i++){
    adjList.push_back(neighbors); // push_back is by *COPY*
}

在您的示例中,通过使用clear和push_back实质上在每次循环迭代中构建相同的向量,您冒着每次迭代的分配和释放。在实践中,大多数实现都不会这样做,但如果我们既可以缩短并可能使事情更有效,我们也可以。

最后,如果邻居的数量相对较小并且行与行相似(例如,有四行元素的有限元代码,其中每个元素连接到~5个其他元素),那么正如其他人建议你可能会更好与矢量矢量不同的结构。例如,逻辑上组织的单个向量,以便每N个元素开始一个新的“行”。