C++ 在二维向量中插入元素

C++ 在二维向量中插入元素,c++,vector,adjacency-list,C++,Vector,Adjacency List,所以我创建了一个实现邻接列表的类。目前在我的类定义中,我初始化了两个向量: vector<vector<int>> adjList; vector<int> neighbors; 把我的头绕在二维向量上越来越困难了。我知道它本质上是一个向量向量,但我不知道如何在其中一个“子向量”中插入一个新值。例如,我可以在createAdjList中创建一个空的邻接列表,其中包含以下循环: for (int i = 0; i < numOfValues; i++){

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

vector<vector<int>> adjList;
vector<int> neighbors;
把我的头绕在二维向量上越来越困难了。我知道它本质上是一个向量向量,但我不知道如何在其中一个“子向量”中插入一个新值。例如,我可以在createAdjList中创建一个空的邻接列表,其中包含以下循环:

for (int i = 0; i < numOfValues; i++){
    neighbors.push_back(0);
    adjList.push_back(neighbors);
    neighbors.clear();
}
我知道我可以通过说adjList[4][1]来访问2D向量中的特定值,但我如何才能将其推到上面呢


谢谢

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

adjList[x].push_back();

这里有几个注释

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

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
向量邻域(1,0);//设置为长度1,值为零 向量调整列表(numofalues,邻居);//“外部”向量的长度为NUMOF . // 每一行都是邻居的*副本* 如果您在构建时不能做到这一点(可能numofalues还不知道),那么我们仍然可以使用更好的循环语法:

// 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*
}
//可以重用邻居对象
邻居。清除(0);
邻居。推回(0);
adjList.reserve(numOfValues);//提前保留内存将阻止分配
对于(int i=0;i
在您的示例中,通过在每次循环迭代中使用clear和push_基本上构建相同的向量,您在每次迭代中都面临分配和取消分配的风险。在实践中,大多数实现不会这样做,但如果我们能够缩短时间并潜在地提高效率,我们也可以这样做


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

如果最初在向量中没有任何值- 可以将值推入一个向量,然后将该向量推入二维向量。 例如:

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

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

我不明白,你能不能这样做:
adjList[4][1]=987
?如果我已经在[4][1]位置上有一个值,那就行了,但是如果我真的想把一个值推到向量4的末尾,我必须以某种方式把u向后推,对吗?我认为
std::无序映射
可能更好。只是我的意见。然后做这个调整列表[4]。推回()哦,哇,我不知道你只能指定二维向量中的一个坐标。那就容易多了,谢谢@Mardo我认为重要的是要理解,
adjList[x]
返回对存储在位置
x
的向量的引用。因此,
adjList[x][y]
(adjList[x])[y]
相同,意思是:首先,给我一个位于
adjList
x
位置的向量的引用(我们称之为V),然后给我一个位于V中
y
位置的整数的引用。这个片段在for循环中吗?
// 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*
}
  vector< vector<int> > vt1;
  vector<int> vt2;

  vt2.push_back(value);
  vt1.push_back(vt2);
vt1[index].push_back(value);