对 Vector 元素的 push_back 操作 (C++)
Posted
技术标签:
【中文标题】对 Vector 元素的 push_back 操作 (C++)【英文标题】:Operation of push_back on an element of Vector (C++) 【发布时间】:2020-05-26 17:48:47 【问题描述】:我是一名尝试提高 C++ 能力的 Python 程序员。我有一个关于向量的愚蠢问题。
假设我有一个像这样的向量
vector<int> adj;
假设它包含一些值。这个操作是做什么的?
adj[v].push_back(w)
它会创建向量的向量吗?它与拥有一个,有什么不同
vector<vector<int>> adj
开始?
编辑:: 相关代码是一个简单的 BFS on graph,可以完美编译和运行。
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
【问题讨论】:
那甚至不应该编译。adj[v]
返回一个int
(假设v < adj.size()
),但C++ 中的int
不是结构或类,因此它不能用点调用任何字段或方法...所以它不会像上面评论中提到的那样编译。
在代码示例中,adj
是指向list
的指针。执行adj[v]
是告诉编译器adj
实际上指向一个数组,我想要该数组中的v
th 列表,然后将w
添加到该列表中。当然,这里只有 1 个列表,所以 v
的任何值不是 0 都是错误的。但是,此代码示例并不代表您提出的问题。你会问vector<int> * adj;
而不是vector<int> adj;
。
请不要以使现有答案无效的方式编辑问题。而是提出一个不同的新问题。并且下次一定要发Minimal Reproducible Example,这样你问的问题就和你以为你问的一样。
【参考方案1】:
假设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
附加到该特定向量。
【讨论】:
【参考方案2】:在您提供的代码中,adj
被创建为new list<int>[V]
。这不是您要问的(即它不是向量,也不是列表,它是动态分配的列表数组)。
然后:
adj[v].push_back(w)
意思是:获取列表数组中的v
元素(作为要检索的元素的v ==索引),它会是一个列表,然后push_back
进入这个列表w
。
【讨论】:
【参考方案3】:在提供的类定义中没有向量。
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);
选择了索引为v
、adj[v]
的数组元素,它表示std::list<int>
类型的对象,并使用成员函数push_back
将对象w
附加到此列表中类模板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
【讨论】:
感谢您的回复。我解决了我的问题并用向量替换了列表。你的解释很完美。谢谢【参考方案4】:您发布的代码尝试在int
s 的vector
的元素上调用push_back
。这使得 no 有意义,因为 int
不是具有 push_back
成员函数的对象。该代码无法编译。
【讨论】:
【参考方案5】:你有一个一维数组。每个索引只能添加 1 个元素。 adj[v].push_back(w)
的意思是你想将元素 w 推到索引 v 处,这是不可能的,因为你将向量声明为
vector<int> adj;
要实现二维向量,您需要将其定义为 -
vector<vector<int> >adj;
如果 v 是有效索引,则您的操作 adj[v].push_back(w)
将起作用。
【讨论】:
以上是关于对 Vector 元素的 push_back 操作 (C++)的主要内容,如果未能解决你的问题,请参考以下文章