所以我创建了一个实现邻接列表的类。目前在我的班级定义中,我初始化了两个向量:
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向量中的特定值,但是如何将其推到它上面呢?
谢谢!
答案 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个元素开始一个新的“行”。