繁体   English   中英

向量迭代器不兼容:迭代两个向量的正确方法?

[英]Vector Iterators Incompatible: proper way to iterate over two vectors?

我的一位老师要求我们创建一个类,该类可以迭代两个不同的向量,使它们看起来好像与调用者的 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 << ":";

这在调试时失败并显示“调试断言失败”消息:Vector Iterators Incompatible on line return (context != other.context) || (it != other.it); return (context != other.context) || (it != other.it); 使用 Visual Studio 2019。

这样做的方法是在内部保存两个迭代器。 一个到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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM