将元素插入 2D 矢量

Inserting elements into 2D vector

本文关键字:矢量 2D 插入 元素      更新时间:2023-10-16

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

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

我声明了两个我计划用来实现它的函数:

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

我很难理解 2D 矢量。我知道它本质上是向量的向量,但我对如何将新值插入其中一个"子向量"感到困惑。例如,我能够在createAdjList中创建一个邻接列表,该列表为空,并具有以下循环:

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

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

insertIntoAdjList(4, 5);

我知道我可以通过说adjList[4][1]来访问2D向量中的特定值,但是我怎样才能将一个值推到上面呢?

谢谢!

要推送作为另一个向量的元素的向量,您只需这样做

adjList[x].push_back();

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

  vector< vector<int> > vt1;
  vector<int> vt2;
  vt2.push_back(value);
  vt1.push_back(vt2);

如果您的向量已经填充,则 -

vt1[index].push_back(value);

这里有几点注意事项。

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

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 个元素开始一个新的"行"。