Bạn sẽ cần phải làm một chút công việc. Bạn cần phải thực hiện riêng lớp học của bạn tùy chỉnh iterator, và begin()
và end()
:
struct Permutation
{
std::vector<std::string> items;
std::vector<short> permutationValue;
class iterator;
iterator begin();
iterator end();
};
lớp iterator của bạn sẽ là một iterator truy cập ngẫu nhiên:
#include <iterator>
class Permutation::iterator : public std::iterator<std::random_access_iterator_tag, std::string>
{
};
Điều quan trọng là để kế thừa từ std::iterator
, để cho trình biến đổi tùy chỉnh của bạn hoạt động chính xác với <algorithm>
.
Có một số cách có thể để triển khai trình lặp. Nhưng ý tưởng chung là iterator của bạn sẽ lưu trữ một con trỏ đến đối tượng hoán vị của nó, và vị trí index hiện tại của mình, các thành viên lớp riêng của nó:
private:
Permutation *p;
size_t pos;
operator*
của nó được rõ ràng:
public:
std::string &operator*() const
{
return p->items[p->permutationValue[pos]];
}
Bạn sẽ cần triển khai tất cả toán tử vòng lặp khác, tăng/giảm truy cập trước trình lặp lặp ngẫu nhiên, toán tử ++
, --
, +
, -
, +=
, -=
, chỉ cần thêm hoặc trừ pos
.
Bạn cũng sẽ cần phải thực hiện tất cả các toán tử so sánh cho lớp iterator của bạn: <
, >
, =
, !=
, <=
, và >=
, chỉ đơn giản bằng cách so sánh pos
.
Các bit này sẽ hơi tẻ nhạt, nhưng không thể tránh khỏi. Bây giờ, tất cả những gì bạn phải làm là triển khai begin()
và end()
bằng cách tạo phiên bản trình lặp này, đặt pos
ban đầu thành 0 hoặc items.size();
. Bạn đã hoàn tất. Bây giờ bạn có thể sử dụng lặp lại phạm vi.
Để nhận thêm tín dụng, bạn cũng có thể triển khai const_iterator
.
Kết luận: nó sẽ là một chút công việc, nhưng nó không phải là rất phức tạp.
bắt đầu(), kết thúc() trả về trình lặp vòng –
@BartoszPrzybylski Tôi giả định rằng trình vòng lặp nên loại nào đó đặc biệt? Bạn có thể làm rõ nó. –
Một phạm vi đòi hỏi các thành viên 'begin()' và 'end()'. Bạn có thể có 'vector :: iterator begin() {return items.begin(); } 'và tương đối hàm' end() '. Bạn nên đảm bảo rằng 'các mục' đã chứa các giá trị được hoán vị mặc dù. Việc tính toán trong bản thực thi iterator sẽ là một nỗi đau. –
DeiDei