push_back 对 Vector 元素的运算 (C++)
Operation of push_back on an element of Vector (C++)
我是一名 Python 程序员,正在努力提高 C++ 的熟练程度。我有一个关于向量的愚蠢问题。
假设我有这样一个向量
vector<int> adj;
假设它包含一些值。这个操作是做什么的?
adj[v].push_back(w)
它创建向量的向量吗?它与拥有一个,
有什么不同
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
的元素上调用 push_back
。这使得 no 有意义,因为 int
不是具有 push_back
成员函数的对象。该代码无法编译。
假设vector<int> adj
:
adj[v].push_back(w)
将在 adj 上调用 operator[]
,这将 return 一个 int &
(假设 v
是某个标量)。然后它将尝试在编译失败的 int &
上调用 push_back
。
假设vector<vector<int>> adj
:
adj[v].push_back(w)
将在 adj 上调用 operator[]
,这将 return 一个 vector<int> &
(假设 v
是某个标量)。然后它将在 vector<int> &
上调用 push_back
,将值 w
附加到该特定向量。
你有一个一维数组。每个索引只能添加 1 个元素。 adj[v].push_back(w)
所暗示的是,您想将元素 w 推入索引 v,这是不可能的,因为您将向量声明为
vector<int> adj;
要实现二维向量,您需要将其定义为 -
vector<vector<int> >adj;
如果 v 是一个有效的索引,你的操作 adj[v].push_back(w)
将起作用。
在您提供的代码中,adj
被创建为 new list<int>[V]
。这不完全是你问的(即它不是一个向量,也不是一个列表,它是一个动态分配的列表数组)。
然后:
adj[v].push_back(w)
的意思是:获取列表数组中的v
元素(如v ==要检索的元素的索引),它将是一个列表,然后push_back
进入这个列表w
.
在提供的 class 定义中没有向量。
class Graph
{
int V;
list<int> *adj;
public:
Graph(int V);
void addEdge(int v, int w);
void BFS(int s);
};
声明了一个数据成员,其类型指针指向 std::list<int>
。
在class
的构造函数中
Graph::Graph(int V)
{
this->V = V;
adj = new list<int>[V];
}
动态分配了一个 std::list<int>
类型的对象数组,数组第一个元素的地址分配给数据成员 adj
.
因此在这个声明中
adj[v].push_back(w);
选择了索引为 v
、adj[v]
的数组元素,表示类型 std::list<int>
的对象,并向此列表附加对象 w
使用 class 模板的成员函数 push_back
std::list
.
至于向量,那么您确实可以声明一个向量的向量,例如
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
我是一名 Python 程序员,正在努力提高 C++ 的熟练程度。我有一个关于向量的愚蠢问题。
假设我有这样一个向量
vector<int> adj;
假设它包含一些值。这个操作是做什么的?
adj[v].push_back(w)
它创建向量的向量吗?它与拥有一个,
有什么不同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
的元素上调用 push_back
。这使得 no 有意义,因为 int
不是具有 push_back
成员函数的对象。该代码无法编译。
假设vector<int> adj
:
adj[v].push_back(w)
将在 adj 上调用 operator[]
,这将 return 一个 int &
(假设 v
是某个标量)。然后它将尝试在编译失败的 int &
上调用 push_back
。
假设vector<vector<int>> adj
:
adj[v].push_back(w)
将在 adj 上调用 operator[]
,这将 return 一个 vector<int> &
(假设 v
是某个标量)。然后它将在 vector<int> &
上调用 push_back
,将值 w
附加到该特定向量。
你有一个一维数组。每个索引只能添加 1 个元素。 adj[v].push_back(w)
所暗示的是,您想将元素 w 推入索引 v,这是不可能的,因为您将向量声明为
vector<int> adj;
要实现二维向量,您需要将其定义为 -
vector<vector<int> >adj;
如果 v 是一个有效的索引,你的操作 adj[v].push_back(w)
将起作用。
在您提供的代码中,adj
被创建为 new list<int>[V]
。这不完全是你问的(即它不是一个向量,也不是一个列表,它是一个动态分配的列表数组)。
然后:
adj[v].push_back(w)
的意思是:获取列表数组中的v
元素(如v ==要检索的元素的索引),它将是一个列表,然后push_back
进入这个列表w
.
在提供的 class 定义中没有向量。
class Graph
{
int V;
list<int> *adj;
public:
Graph(int V);
void addEdge(int v, int w);
void BFS(int s);
};
声明了一个数据成员,其类型指针指向 std::list<int>
。
在class
的构造函数中Graph::Graph(int V)
{
this->V = V;
adj = new list<int>[V];
}
动态分配了一个 std::list<int>
类型的对象数组,数组第一个元素的地址分配给数据成员 adj
.
因此在这个声明中
adj[v].push_back(w);
选择了索引为 v
、adj[v]
的数组元素,表示类型 std::list<int>
的对象,并向此列表附加对象 w
使用 class 模板的成员函数 push_back
std::list
.
至于向量,那么您确实可以声明一个向量的向量,例如
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