【发布时间】:2021-12-20 09:40:33
【问题描述】:
我的一位老师要求我们创建一个类,该类可以迭代两个不同的向量,使它们看起来好像与调用者的 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); }
};
以及对应的main:
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 << ":";
这在调试时失败,并显示“调试断言失败”消息:Vector Iterators Incompatible on line return (context != other.context) || (it != other.it); using Visual Studio 2019。
【问题讨论】:
-
有多种方法可以防止比较来自两个不同向量的迭代器。最简单的方法之一是将布尔标志
in_vec1添加到concat。然后首先比较这个标志,如果需要,再比较迭代器。 -
@MarcStevens 谢谢,这可能是我的案例最简单的解决方案。存储两个迭代器可能会浪费更多的内存。
标签: c++ visual-studio vector stl std