Mình được biết "std::iterator" bị phản đối (deprecated) và sẽ bị gở bỏ, vậy mong muốn của mình còn thực hiện được không?
Mình muốn tạo 1 container giống vector và iterator. Container của mình là 1 mảng char cài đặt bằng vector "vch", ta chỉ quan tâm đến giá trị char tại các chỉ số chẵn, tại các chỉ số lẻ đều là 0, size() của nó được tính bằng 1/2 "vch.size()". Đây là những gì mình làm được
Cái mình muốn là có thể sử dụng các hàm có tham số kiểu iterator như hàm sort, max_element v.v, hỏi phải làm thế nào?Cảm ơn bạn đã đọcC++ Code:
#include <iostream> #include <vector> #include <algorithm> namespace std { class Step2Array { private: vector<char> vch; public: class iterator; void push_back(int n) { vch.push_back(n); vch.push_back(0); } size_t size() { return vch.size() / 2; } Step2Array::iterator begin() { return Step2Array::iterator(this, 0); } Step2Array::iterator end() { return Step2Array::iterator(this, size()); } class iterator { private: Step2Array* arr; int pos; public: iterator(){} iterator(Step2Array* arr, int pos) : arr(arr), pos(pos){} iterator& operator++(int) { pos++; return *this; } iterator& operator++() { pos++; return *this; } int operator*() { return arr->vch[pos*2]; } bool operator==(iterator it) { return arr == it.arr && pos == it. pos; } bool operator!=(iterator it) { return !(*this == it); } }; }; } int main(int argc, char *argv[]) { std::Step2Array arr; arr.push_back(2); arr.push_back(3); arr.push_back(5); arr.push_back(7); arr.push_back(11); arr.push_back(13); arr.push_back(17); std::Step2Array::iterator begin, end; begin = arr.begin(); end = arr.end(); while (begin != end) { begin++; } for (int i : arr) { } //std::cout << max_element(arr.begin(), arr.end()) << "\n"; //sort(arr.begin(), arr.end()); }/* kết quả là 2 3 5 7 11 13 17 2. 3. 5. 7. 11. 13. 17. */
Mình được biết "std::iterator" bị phản đối (deprecated) và sẽ bị gở bỏ, vậy mong muốn của mình còn thực hiện được không?
Vẫn thực hiện được như thường thôi. Có điều là không rõ bạn định thay đổi (hoặc viết đè) các hàm sort, max_element của thư viện <algorithm> hay bạn định viết các hàm đó như là thành phần của lớp Step2Array.
Mình muốn dùng luôn hàm "sort", "max_element",... của <algorithm> mà không ghi đè, thay đổi hay viết mới gì cả,
tại mình thấy hàm "sort" có tham số kiểu iterator nên mình nghĩ nó cũng sẽ chạy với lớp iterator tự tạo của mình, nhưng khi chạy thử thì nó báo thiếu value_type gì đó
Tóm lại, mình phải code Step2Array và Step2Array::iterator như thế nào để khi gọi sort,... của <algorithm> nó cho ra kết quả đúng
Đã được chỉnh sửa lần cuối bởi khoaph : 11-08-2020 lúc 07:33 PM.
Có 2 cách làm chuyện này.
1: Như mã bạn viết, chỉ cần thêm hàm sort trong namespace std riêng của bạn. Bạn cần viết mã cho hàm sort này, Hàm sort của <algorithm> sử dụng đối số bình thường. Thật ra đây là hạ sách, đúng hơn là mẹo vặt vì nó chẳng qua đánh lừa về ngữ nghĩa mà thôi.
2: Bạn cài đặt hàng loạt các bản mẫu (template) các lớp phù hợp với các đối số của hàm sort trong <algorithm>. Đây là cách căn cơ và tốn nhiều công sức, mai mốt chúng ta tiếp tục.
- - - Nội dung đã được cập nhật ngày 12-08-2020 lúc 02:03 PM - - -
Bạn xem chỉnh sửa mã này
C++ Code:
#include <iostream> // std::cout #include <algorithm> // std::sort #include <vector> // std::vector #include <time.h> using std::vector; class Step2Array { private: vector<int> m_vtChar1; // Vector lưu mảng chết - dùng cho các công việc khác vector<int> m_vtChar2; // Lưu mảng dùng cho hàm sort của <algorithm> public: void push_back(int n) { m_vtChar1.push_back(n); m_vtChar1.push_back(0); m_vtChar2.push_back(n); // Nhập vào } size_t size() { return m_vtChar2.size(); } vector<int>::iterator begin() { return m_vtChar2.begin(); } vector<int>::iterator end() { return m_vtChar2.end(); } static bool incsort(int i, int j) { return (i<j); } // Sắp xếp tăng - mặc định của sort static bool dessort(int i, int j) { return (i>j); } // Sắp xếp giảm }; int main() { // Tạo mẫu thử srand((unsigned int)time(0)); Step2Array arr; for (int i = rand() % 5 + 5; i >= 0; i--) arr.push_back(rand() % 50); // In mảng for (int i : arr) // Sắp xếp tăng std::sort(arr.begin(), arr.end()); for (int i : arr) // Sắp xếp giảm std::sort(arr.begin(), arr.end(), arr.dessort); for (int i : arr) return 0; }
Cảm ơn bạn, nhưng code trên không đúng ý của mình. Thứ nhất mình không muốn tạo thêm mảng trung gian để dùng cho hàm "sort". Thứ hai mình muốn dùng Step2Array::iterator tự tạo chứ không phải vecror<int>::iterator
Để rõ hơn, mình code chương trình khác
Ch tr này tạo một mảng (container) các số nguyên có giá trị 0..15, cài đặt trên vector<char>, mỗi char chứa 2 số,( mỗi số chiếm 4 bit) và mình đã code các hàm push_back, set(short i, short n) để gán phần tử(nhóm 4 bit) thứ i giá trị n, get(short i) để lấy giá trị của phần tử thứ i
Hàm sort của <algorithm> đòi hỏi 2 tham số đầu là random access iterator, nên mình nghĩ nếu tạo được lớp FourBitsArray::iterator thích hợp, kế thừa random access iterator hay sao đó..., thì cũng có thể truyền nó vào hàm sort .C++ Code:
#include <iostream> #include <vector> #include <algorithm> namespace std { class FourBitsArray { private: std::vector<char> vch; size_t sz = 0; public: size_t size() { return sz; } void push_back(short n) { n = n & 15; short i = vch.size() - 1; if (sz % 2 == 1) { vch[i] = vch[i] | n; } else { vch.push_back(n<<4); } sz++; } void set(short i, short n) { if (i < 0 || i >= sz) { throw "Index out of range"; } n = n & 15; if (i % 2 == 0) { vch[i / 2] = vch[i / 2] & 15; vch[i / 2] = vch[i / 2] | (n << 4); } else { vch[i / 2] = vch[i / 2] & 240; vch[i / 2] = vch[i / 2] | n; } } short get(short i) { if (i < 0 || i >= sz) { throw "Index out of range"; } if (i % 2 == 0) { return vch[i / 2] >> 4; } else { return vch[i / 2] & 15; } } class iterator { }; }; } int main(int argc, char *argv[]) { std::FourBitsArray arr; short n[11] = {2, 5, 3, 9, 12, 8, 15, 11, 4, 6, 7}; for (short i = 0; i < 11; i++) { arr.push_back(n[i]); } for (short i = 0; i < arr.size(); i++) { } arr.set(3, 13); arr.set(8, 14); for (short i = 0; i < arr.size(); i++) { } } /* 2 5 3 9 12 8 15 11 4 6 7 2 5 3 13 12 8 15 11 14 6 7 size()=11 */ [Program finished]
Cái mình thắc mắc là mình có thể tạo lớp như vậy được không và nếu được thì làm như thế nào?
Mình không vội, mình sẽ đợi đến lúc có câu trả lời
Đã được chỉnh sửa lần cuối bởi khoaph : 31-10-2020 lúc 08:22 PM.
À, vẫn chưa ai trả lời.