【问题标题】:Operation of push_back on an element of Vector (C++)对 Vector 元素的 push_back 操作 (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 &lt; adj.size()),但C++ 中的int 不是结构或类,因此它不能用点调用任何字段或方法...所以它不会像上面评论中提到的那样编译。
  • 在代码示例中,adj 是指向list 的指针。执行adj[v] 是告诉编译器adj 实际上指向一个数组,我想要该数组中的vth 列表,然后将w 添加到该列表中。当然,这里只有 1 个列表,所以 v 的任何值不是 0 都是错误的。但是,此代码示例并不代表您提出的问题。你会问vector&lt;int&gt; * adj; 而不是vector&lt;int&gt; adj;
  • 请不要以使现有答案无效的方式编辑问题。而是提出一个不同的新问题。并且下次一定要发Minimal Reproducible Example,这样你问的问题就和你以为你问的一样。

标签: c++ vector stl push-back


【解决方案1】:

假设vector&lt;int&gt; adj

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

假设vector&lt;vector&lt;int&gt;&gt; adj:

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

【讨论】:

    【解决方案2】:

    在您提供的代码中,adj 被创建为new list&lt;int&gt;[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&lt;int&gt;

      在类的构造函数中

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

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

      因此在此声明中

      adj[v].push_back(w);
      

      选择了索引为vadj[v] 的数组元素,它表示std::list&lt;int&gt; 类型的对象,并使用成员函数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】:

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

      【讨论】:

        【解决方案5】:

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

        vector&lt;int&gt; adj;

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

        vector<vector<int> >adj;
        

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

        【讨论】:

          猜你喜欢
          • 2013-12-19
          • 2016-03-31
          • 2013-11-04
          • 2014-05-27
          • 1970-01-01
          • 2012-06-15
          • 2011-05-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多