【问题标题】:iterating over vector of vectors in c++在c ++中迭代向量的向量
【发布时间】:2016-09-04 17:01:34
【问题描述】:

我刚开始用 C++ 编写代码,所以我是 STL 的新手。 在这里,我试图迭代存储为向量向量的图形。

#include <iostream>
#include <vector>
#include <iostream>

using namespace std;

int reach(vector<vector<int> > &adj, int x, int y) {
    vector<vector<int> >::iterator it;
    vector<int>::iterator i;

    for (it = adj.begin(); it != adj.end(); it++)
    {
        cout << (*it) << endl;
        if ((*it) == x)
            for (i = (*it).begin(); i != (*it).end(); i++)
            {
                cout << (*i) << endl;
                if ((*i) == y)
                    return 1;

            }
    }
    return 0;
}

int main()
{

}

我收到一个错误std::vector&lt;int&gt; 不是从 const gnu cxx 派生的。有人能指出我正确的方向吗?

【问题讨论】:

  • *itvector&lt;int&gt;,而不是单个 int。您认为将其发送到cout 或将其与整数x 进行比较意味着什么?
  • 哎呀!我在那里看到了我的错误。该死。谢谢!

标签: c++ vector stl


【解决方案1】:

*it 指向 vector 而不是 int 这就是你得到错误的原因

以下代码可能对您有用

    #include <vector>
    #include <iostream>

   using namespace std;

  int reach(vector<vector<int> > &adj, int x, int y) {
  vector<vector<int> >::iterator it;
  vector<int>::iterator i;

  for (it = adj.begin(); it != adj.end(); it++)
  {
     cout << (*(*it).begin()) << endl;
    if (( (*(*it).begin())) == x)
        for (i = (*it).begin(); i != (*it).end(); i++)
        {
            cout << (*i) << endl;
            if ((*i) == y)
                return 1;

        }
   }
  return 0;
   }

  int main()
  {

  }

用于访问使用的向量的第一个元素

   (*(*it).begin()) in place of (*it)

如果您正在研究图形,请使用向量数组。有关更多详细信息,请通过以下网址 C++ Depth First Search (DFS) Implementation

【讨论】:

    【解决方案2】:
     cout << (*it) << endl;
    

    在这里,您将it 声明为:

     vector<vector<int> >::iterator it;
    

    因此,*it 是:

     vector<int>
    

    所以您尝试使用operator&lt;&lt; 将其发送到std::cout。这显然行不通。这相当于:

     vector<int> v;
    
     cout << v;
    

    没有为cout 定义的operator&lt;&lt; 重载和vector&lt;int&gt;。如您所知,为了打印向量的内容,您必须遍历其各个值,并打印其各个值。

    所以,无论你的意图是什么,当你写的时候:

    cout << (*it) << endl;
    

    你需要做些别的事情,记住*it这里是一个完整的vector&lt;int&gt;。也许您的意图是遍历向量并打印向量中的每个int,但您稍后已经在这样做了。

    同样:

     if ((*it) == x)
    

    这也行不通。如前所述,*itvector&lt;int&gt;,无法与普通的 int 进行比较。

    目前尚不清楚您的意图是什么。 “存储为一个或多个向量的图形”太模糊了。

    【讨论】:

      【解决方案3】:

      以下代码使用选项 std=c++11 进行编译。但是vector&lt;vector&lt;int&gt;&gt; 中缺少x。如果adjvector&lt;pair&lt;int, vector&lt;int&gt;&gt;&gt; 类型,它会更好地匹配。

      以下代码编译为vector&lt;vector&lt;int&gt;&gt;,但不使用x

      using std::vector;
      using std::pair;
      using std::cout;
      using std::endl;
      
      int reach(vector<vector<int> > &adj, int x, int y) {
        vector<vector<int> >::iterator it;
          vector<int>::iterator i;
          for(it=adj.begin();it!=adj.end();it++)
              {
                  // cout << (*it) << endl;
                  for (const auto& nexts: *it)
                     cout << nexts << ' ';
                  cout << endl;
      
                  for(i=(*it).begin();i!=(*it).end();i++)
                  {
                      cout << (*i) << endl;
                      if((*i)==y)
                          return 1;
                      }
                  }
         return 0;
      }
      

      此代码使用&lt;vector&lt;pair&lt;int, vector&lt;int&gt;&gt;&gt; 编译并使用x

      using std::vector;
      using std::pair;
      using std::cout;
      using std::endl;
      
      int reach(vector<pair<int, vector<int> > > &adj, int x, int y) {
        vector<pair<int, vector<int> > >::iterator it;
          vector<int>::iterator i;
          for(it=adj.begin();it!=adj.end();it++)
              {
                  cout << it->first << endl;
      
                  if (it->first == x)
                      for(i=it->second.begin();i!=it->second.end();i++)
                      {
                          cout << (*i) << endl;
                          if((*i)==y)
                              return 1;
      
                          }
                      }
         return 0;
      }
      

      【讨论】:

        【解决方案4】:

        将它包装在一个迭代器中。 这可以模板化以供重复使用。

        这是std::vector&lt;T&gt; 容器的最小工作示例:

        #include <iostream>
        #include <utility>
        #include <vector>
        
        /// Iterable vector of vectors
        /// (This just provides `begin` and `end for `Vector2Iterable<T>::Iterator`).
        template<typename T>
        class VovIterable
        {
        public:
            static const std::vector<T> EMPTY_VECTOR;
        
            /// Actual iterator
            class Iterator
            {
                typename std::vector<std::vector<T>>::const_iterator _a1;
                typename std::vector<T>::const_iterator _a2;
                typename std::vector<std::vector<T>>::const_iterator _end;
        
            public:
                /// \param a1      Outer iterator
                /// \param a2      Inner iterator
                /// \param end     End of outer iterator
                explicit Iterator(typename std::vector<std::vector<T>>::const_iterator a1, typename std::vector<T>::const_iterator a2, typename std::vector<std::vector<T>>::const_iterator end)
                        : _a1(a1)
                          , _a2(a2)
                          , _end(end)
                {
                    Check();
                }
        
                bool operator!=(const Iterator &b) const
                {
                    return _a1 != b._a1 || _a2 != b._a2;
                }
        
                Iterator &operator++()
                {
                    ++_a2; // Increment secondary
                    Check();
                    return *this;
                }
        
                const T &operator*() const
                {
                    return *_a2;
                }
        
            private:
                void Check()
                {
                    while (true)
                    {
                        if (_a2 != _a1->end()) // Is secondary live?
                        {
                            break;
                        }
        
                        // Increment primary
                        _a1++;
        
                        if (_a1 == _end) // Is primary dead?
                        {
                            _a2 = EMPTY_VECTOR.end();
                            break;
                        }
        
                        _a2 = _a1->begin(); // Reset secondary
                    }
                }
            };
        
        private:
            std::vector<std::vector<T>> _source;
        
        public:
            explicit VovIterable(std::vector<std::vector<T>> source)
                    : _source(std::move(source))
            {
        
            }
        
            /// Start of vector of vectors
            [[nodiscard]] Iterator begin() const
            {
                if (this->_source.empty())
                {
                    return end();
                }
        
                return Iterator(this->_source.cbegin(), this->_source.cbegin()->cbegin(), this->_source.cend());
            }
        
            /// End of vector of vectors
            [[nodiscard]] Iterator end() const
            {
                return Iterator(this->_source.cend(), EMPTY_VECTOR.end(), this->_source.cend());
            }
        
        };
        
        template<typename T>
        const std::vector<T> VovIterable<T>::EMPTY_VECTOR = {0};
        
        /// Sample usage
        int main()
        {
            std::vector<std::vector<int>> myVov{{1, 2, 3},
                                                {4, 5, 6},
                                                {7, 8, 9}};
        
            for (int i: VovIterable(myVov))
            {
                std::cout << i << std::endl;
            }
        
            return 0;
        }
        

        【讨论】:

          猜你喜欢
          • 2020-11-01
          • 1970-01-01
          • 2013-01-02
          • 1970-01-01
          • 2013-12-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多