Lưu trạng thái mảng 2 chiều
Em xin chào các anh chị ạ, em là newbie C++, em có một thắc mắc là khi em thao tác trên mảng 2 chiều, làm sao qua các tác vụ em có thể lưu trạng thái mới của mảng. Chẳng hạn, em viết hàm chuyển ma trận thành ma trận chuyển vị, dùng cấp phát động, nhưng sau khi gọi hàm chuyển vị, cho xuất ma trận thì ma trận vẫn không thay đổi thành ma trận chuyển vị. Em có biết vụ truyền reference trong mảng 1 chiều, nhưng không biết làm sao tương tự trong mảng 2 chiều, các anh chị có thể giúp em được không ạ, em cảm ơn ạ .
xài
std::vector
đi emcách khai báo mảng số nguyên 1 chiều
a
có 5 phần tử, giá trị mỗi phần tử là 2:std::vector<int> a(5, 2);
mảng 2 chiều là mảng chứa mảng 1 chiều. Có thể khai báo là
std::vector< std::vector<int> >
. Nếu thấy dài quá thì em có thể xàitypedef
đỡ:typedef std::vector<int> IntVec;
typedef std::vector<IntVec> IntMatrix;
rồi khai báo như 1 mảng bình thường. Ví dụ muốn khai báo mảng 2 chiều 5x6, giá trị mặc định mỗi phần tử là 1:
IntMatrix m(5, IntVec(6, 1));
truyền vào hàm dễ dàng:
void inplace_transpose(IntMatrix& m)
hoặc trả về 1 ma trận dễ dàng:
truy cập phần tử trong ma trận dễ dàng như mảng 2 chiều:
m[0][1] = ...
khỏi cần lưu số dòng số cột, nếu muốn biết số dòng, số cột:
int R = m.size();
int C = m[0].size();
Anh ơi, vậy tại sao bình thường em thấy người ta vẫn hay dùng cấp phát động hoặc tĩnh cho mảng 2 chiều, ít khi dùng vector vậy anh. Nếu cách vecto có nhiều ưu thế sao người ta hông dùng cho tiện nhỉ. @tntxtnt
tại vì họ viết code 1 lần rồi vứt chứ ko sử dụng lại nhiều lần.
ví dụ hàm
transpose
ko trả vềIntMatrix
mà trả về con trỏ 2 cấpint**
thì mỗi lần xài xong phải nhớ giải phóng cho ma trận chuyển vị kết quả đó. Vớivector
thì ko cần, nó tự động giải phóng dùm mình. Nếu viết code xong rồi vứt thì xàiint**
chả vấn đề gì vì lúc đó còn nhớ phải giải phóng nó. Nếu xài code này cho bài khác sau 5-6 tháng thì lỡ quên phải giải phóngint**
trả về thì sao?em viết code C++, ko phải viết code C. Nếu C thì khác, vì ko có class/template nên mảng động phải cấp phát giải phóng bằng tay thôi. Còn C++ thì sao lại phải khổ dâm như thế.
lý do thật có lẽ là do em chưa học class/template nên người ta ko cho phép xài. Còn học qua class rồi thì con trỏ
*
vứt hết đi nhé.lý do khác nữa: C hardcore, tốc độ là trên hết. Cái gì có liên quan tới class là chậm hết, mặc dù chỉ chậm hơn vài phần trăm cũng là chậm tới mức ko chạy chương trình được. Con trỏ lẹ nhất. Xài con trỏ mới thể hiện trình độ ta đây thượng cấp còn lũ xài class là hạ cấp v.v…
This post was flagged by the community and is temporarily hidden.
Anh trả lời vui quá =)), thượng cấp hạ cấp =)), nhưng em sẽ nghe anh học thêm class cho dễ dàng hơn =)). Tks anh nha =))
đại ý của Linus Torvalds vs C++ đó, ko phải đùa đâu
viết hệ điều hành như ổng thì chắc viết mã máy luôn cho “lành”, còn viết phần mềm bình thường thì vật lộn với con trỏ làm gì…