許多關于 const 迭代器的帖子(示例),但沒有在回圈的背景關系中,例如:
for (const auto it: container) { ... }
當我開始實施時,我被編譯器關于缺少和的抱怨所鼓舞,希望這些抱怨可以指導我填補缺失的部分。我錯了。下面的代碼編譯罰款雖然它確實缺乏這兩者的等價和:beginendoperator operator!=
#include <iostream>
template<class T> class List { public:
const T *head;
const List<T> *tail;
List(const T *h, const List<T> *t):head(h),tail(t){}
const T *operator*() const { return head; } };
template<class T> const List<T> *begin(const List<T> *l) { return l; }
template<class T> const List<T> *end (const List<T> *l) { return nullptr; }
class Person { public: int age; Person(int a):age(a){} };
typedef List<Person> Persons;
int main(int argc, char **argv) {
Person *p1 = new Person(16);
Person *p2 = new Person(27);
Person *p3 = new Person(38);
Persons *persons = new Persons(p1,
new Persons(p2,
new Persons(p3, nullptr)));
for (const auto p: persons) { std::cout << (*p)->age << "\n"; }
return 0; }
這段代碼怎么編譯?
uj5u.com熱心網友回復:
您還沒有定義 and !=,但它們對于您的迭代器型別來說是完美定義的,const List<T>*, 因為是指標型別。但是, 的默認行為 并沒有按照您的意愿行事,即跟隨tail指標。
為了讓您的迭代器具有 應該如何實作的特殊知識,您需要使用單獨的自定義迭代器類,而不是使用指標。
我還對您的代碼進行了一些其他更改:
- 該
List型別是可迭代的,而不是List*. 這意味著begin和end函式不是在指標上定義的,而是在 List 物件本身上定義的,我們迭代*persons而不是persons。 - 在
for (const auto p : *persons),p是一個Person,而不是一個指標。
Godbolt.org 鏈接
#include <iostream>
template<class T> class List { public:
const T *head;
const List<T> *tail;
List(const T *h, const List<T> *t):head(h),tail(t){}
const T *operator*() const { return head; }
class const_iterator {
const List<T>* cur = nullptr;
public:
explicit const_iterator(const List<T>* list) : cur(list) {}
const_iterator& operator () {
cur = cur->tail;
return *this;
}
bool operator!=(const const_iterator& other) const {
return cur != other.cur;
}
const T& operator*() const {
return *cur->head;
}
};
const_iterator begin() const {
return const_iterator(this);
}
const_iterator end() const {
return const_iterator(nullptr);
}
};
class Person { public: int age; Person(int a):age(a){} };
typedef List<Person> Persons;
int main(int argc, char **argv) {
Person *p1 = new Person(16);
Person *p2 = new Person(27);
Person *p3 = new Person(38);
Persons *persons = new Persons(p1,
new Persons(p2,
new Persons(p3, nullptr)));
for (const auto p: *persons) {
std::cout << p.age << "\n";
}
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/397869.html
上一篇:如何使用Terraform激活托管HSM并使用存盤在AzureKeyVaultManagedHSM中的客戶托管密鑰配置加密
下一篇:獲取聯合的第n個元素的安全方法
