在c ++中迭代向量的向量
Posted
技术标签:
【中文标题】在c ++中迭代向量的向量【英文标题】:iterating over vector of vectors in 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<int>
不是从 const gnu cxx 派生的。有人能指出我正确的方向吗?
【问题讨论】:
*it
是 vector<int>
,而不是单个 int
。您认为将其发送到cout
或将其与整数x
进行比较意味着什么?
哎呀!我在那里看到了我的错误。该死。谢谢!
【参考方案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<<
将其发送到std::cout
。这显然行不通。这相当于:
vector<int> v;
cout << v;
没有为cout
定义的operator<<
重载和vector<int>
。如您所知,为了打印向量的内容,您必须遍历其各个值,并打印其各个值。
所以,无论你的意图是什么,当你写的时候:
cout << (*it) << endl;
你需要做些别的事情,记住*it
这里是一个完整的vector<int>
。也许您的意图是遍历向量并打印向量中的每个int
,但您稍后已经在这样做了。
同样:
if ((*it) == x)
这也行不通。如前所述,*it
是 vector<int>
,无法与普通的 int
进行比较。
目前尚不清楚您的意图是什么。 “存储为一个或多个向量的图形”太模糊了。
【讨论】:
【参考方案3】:以下代码使用选项 std=c++11 进行编译。但是vector<vector<int>>
中缺少x
。如果adj
有vector<pair<int, vector<int>>>
类型,它会更好地匹配。
以下代码编译为vector<vector<int>>
,但不使用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;
此代码使用<vector<pair<int, vector<int>>>
编译并使用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<T>
容器的最小工作示例:
#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>> myVov1, 2, 3,
4, 5, 6,
7, 8, 9;
for (int i: VovIterable(myVov))
std::cout << i << std::endl;
return 0;
【讨论】:
以上是关于在c ++中迭代向量的向量的主要内容,如果未能解决你的问题,请参考以下文章
如何在 C++/OpenCV 中将 cv::Point 添加到数组或向量?