向量迭代程序不兼容:在两个向量上迭代的正确方法



我的一位老师让我们创建一个类,该类可以迭代两个不同的向量,使它们看起来与调用方的pov相邻。其中一个要求是矢量不能被复制。据我所知,来自两个不同向量的迭代器无法进行比较,所以我看不出写这个类的正确方法是什么。这是老师的版本,我做了一些修复:

class concat {
std::vector<std::string>& vec1;
std::vector<std::string>& vec2;
public:
concat(std::vector<std::string>& v1, std::vector<std::string>& v2) : vec1(v1), vec2(v2) {}
class iterator {
std::vector<std::string>::iterator it;
concat* context;
public:
iterator(std::vector<std::string>::iterator& it, concat* context) : it(it), context(context) {}
std::string& operator*() {
return *it;
}
iterator& operator++() {
it++;
if (it == context->vec1.end())
it = context->vec2.begin();
return *this;
}
bool operator!=(const iterator& other) const {
return (context != other.context) || (it != other.it);
}
};
iterator begin() { return iterator(vec1.size() ? vec1.begin() : vec2.begin(), this); }
iterator end()   { return iterator(vec2.end(), this); }
};

和相应的主:

vector<string> v1;
v1.push_back("abc"); v1.push_back("def");
vector<string> v2;
v2.push_back("ghi"); v2.push_back("jkl");
concat conc = concat(v1, v2);
for (const string& s : conc)
cout << s << ":";

这在调试时失败;调试断言失败";消息:使用Visual Studio 2019在线return (context != other.context) || (it != other.it);上的矢量迭代程序不兼容。

实现这一点的方法是在内部保存两个迭代器。一个连接到vec1,另一个连接至vec2。首先使用第一个,然后在第一个到达vec2末尾后切换到另一个。

一些片段来了解我的意思:

itnerator& operator++()
{
if (it1 != vec1.end())
++it1;
else
++it2;
return *this;
}
std::string& operator*()
{
if (it1 != vec1.end())
return *it1;
else
return *it2;
}

最新更新