我的一位老師要求我們創建一個類,該類可以迭代兩個不同的向量,使它們看起來好像與呼叫者的 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 << ":";
這在除錯時失敗,并顯示“除錯斷言失敗”訊息:return (context != other.context) || (it != other.it);使用 Visual Studio 2019在線不兼容向量迭代器。
uj5u.com熱心網友回復:
這樣做的方法是在內部保存兩個迭代器。一個到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;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/351995.html
