对 Vector 元素 (C++) 的push_back操作



我是一名Python程序员,试图提高C++熟练程度。我有一个关于向量的愚蠢问题。

假设我有一个这样的向量

vector<int> adj;

假设它包含一些值。此操作有什么作用?

adj[v].push_back(w)

它是否创建向量的向量?它与拥有 a 有何不同,

vector<vector<int>> adj

首先是 ?

编辑:: 关联代码是图上的简单BFS,可以完美编译和运行。

class Graph 
{ 
int V;  
vector<int> *adj;    
public: 
Graph(int V); 
void addEdge(int v, int w);   
void BFS(int s);   
}; 
Graph::Graph(int V) 
{ 
this->V = V; 
adj = new vector<int>[V]; 
} 
void Graph::addEdge(int v, int w) 
{ 
adj[v].push_back(w); // Add w to v’s list. 
} 

BFS 功能在 GeeksForGeeks 中

假设vector<int> adj

adj[v].push_back(w)将在 adj 上调用operator[],这将返回一个int &(假设v是某个标量(。 然后它将尝试在编译失败的int &上调用push_back

假设vector<vector<int>> adj

adj[v].push_back(w)将在 adj 上调用operator[],这将返回一个vector<int> &(假设v是某个标量(。 然后它将在该vector<int> &上调用push_back,将值w附加到该特定向量。

在您提供的代码中,adj被创建为new list<int>[V]。这不完全是你问的(即它不是一个向量,也不是一个列表,它是一个动态分配的列表数组(。

然后:

adj[v].push_back(w)

意思是:获取列表数组中的v元素(作为要检索的元素的 v == 索引(,它将是一个列表,然后push_back到这个列表中w

在提供的类定义中没有向量。

class Graph 
{ 
int V;  
list<int> *adj;    
public: 
Graph(int V); 
void addEdge(int v, int w);   
void BFS(int s);   
}; 

声明了一个数据成员,其类型指针指向std::list<int>

在类的构造函数中

Graph::Graph(int V) 
{ 
this->V = V; 
adj = new list<int>[V]; 
} 

动态分配了一个类型为std::list<int>的对象数组,并将数组的第一个元素的地址分配给数据成员adj

因此,在此声明中

adj[v].push_back(w);

选择了数组的元素,其索引为vadj[v],表示std::list<int>类型的对象,并使用类模板std::list的成员函数push_back将对象w追加到此列表中。

至于向量,那么你确实可以声明一个向量向量,例如

std::vector<std::vector<int>> v;

要使用下标运算符,您必须创建所需数量的向量元素。

例如,您可以在声明向量时执行此操作。

std::vector<std::vector<int>> v( 10 );

此声明声明了一个包含 10 个元素的向量。现在您可以使用下标运算符通过成员函数push_back向向量添加子向量。

这是一个演示程序。

#include <iostream>
#include <vector>
int main() 
{
std::vector<std::vector<int>> v( 10 );
for ( size_t i = 0; i < v.size(); i++ )
{
int value = 0;
for ( size_t j = 0; j < i + 1; j++ )
{
v[i]. push_back( value++ );
}
}
for ( const auto &sub_vec : v )
{
for ( const auto &item : sub_vec )
{
std::cout << item << ' ';
}
std::cout << 'n';
}
return 0;
}

它的输出是

0 
0 1 
0 1 2 
0 1 2 3 
0 1 2 3 4 
0 1 2 3 4 5 
0 1 2 3 4 5 6 
0 1 2 3 4 5 6 7 
0 1 2 3 4 5 6 7 8 
0 1 2 3 4 5 6 7 8 9 

您发布的代码尝试在ints 的vector元素上调用push_back。这是没有意义的,因为int不是具有push_back成员函数的对象。该代码无法编译。

你有一个一维数组。每个索引只能添加 1 个元素。你adj[v].push_back(w)的意思是你想在索引 v 处推送元素 w,这是不可能的,因为你将向量声明为

vector<int> adj;

要实现二维向量,您需要将其定义为 -

vector<vector<int> >adj;

在这方面,如果 v 是有效索引,您的操作adj[v].push_back(w)将起作用。

最新更新