30/09/2018, 21:53

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 ạ .

viết 23:58 ngày 30/09/2018

xài std::vector đi em

cá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ài typedef đỡ:
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:

IntMatrix transpose(const IntMatrix& m)
{
    int R = ...
    int C = ...
    IntMatrix t(C, IntVec(R, 0)); //tạo 1 ma trận CxR thay vì RxC như m
    //...chuyển vị m vô t
    return t;
}

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();

Phương Nguyễn viết 23:53 ngày 30/09/2018

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

viết 00:09 ngày 01/10/2018

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ấp int** 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ới vector 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ài int** 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óng int** 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…

Tao Không Ngu. viết 00:05 ngày 01/10/2018

This post was flagged by the community and is temporarily hidden.

Phương Nguyễn viết 00:09 ngày 01/10/2018

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 =))

viết 23:55 ngày 30/09/2018

đại ý của Linus Torvalds vs C++ đó, ko phải đùa đâu

C++ is a horrible language. It’s made more horrible by the fact that a lot
of substandard programmers use it, to the point where it’s much much
easier to generate total and utter crap with it.

  • inefficient abstracted programming models where two years down the road
    you notice that some abstraction wasn’t very efficient, but now all
    your code depends on all the nice object models around it, and you
    cannot fix it without rewriting your app.

… And limiting your project to C means that people
don’t screw that up, and also means that you get a lot of programmers that
do actually understand low-level issues and don’t screw things up with any
idiotic “object model” crap.

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ì…

Bài liên quan
0