Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 16 kết quả

Đề tài: Duyệt hết các phần tử của Vector

  1. #1
    Ngày gia nhập
    10 2008
    Nơi ở
    Quảng Trị
    Bài viết
    369

    Mặc định Duyệt hết các phần tử của Vector

    Mình có một chương trình như thế này

    C Code:
    1. #include <iostream>
    2. #include <vector>
    3.  
    4. typedef struct __taghocsinh
    5. {
    6. int tuoi;
    7. int gioitinh;
    8. char ten[30];
    9. } HOCSINH;
    10.  
    11. using namespace std;
    12. int main()
    13. {
    14. vector<HOCSINH> lop12;
    15.  
    16. /* Phần nhập tên, tuổi và giới tính cho các học sinh */
    17.  
    18. /*
    19. In ra hết tên, tuổi và giới tính của từng học sinh
    20. */
    21. }

    Giờ mình phải làm sao để duyệt hết các phần tử của vector lop12???
    Mình đã thử:

    C Code:
    1. int i;
    2. for (i = lop12.begin(); i<= lop12.end(); i++)
    3. {
    4. cout << lop12[i].ten << endl;
    5. /* ... */
    6. }

    Nhưng mà không được, sai kiểu dữ liệu
    Mọi người giúp mình được ko? thanks trước
    Born to walk against the wind... Born to hear my name...
    Stand and fight... Live by your heart...
    Always one more try... I'm not afraid to die...
    Stand and fight... say what you feel...
    Born with a heart of steel ...

  2. #2
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    - vector<> rỗng có gì đâu mà in ra ?
    - int i là kiểu int, lop12.begin() = const_iterator( i.e pointer )
    C++ Code:
    1. #include <iostream>
    2. #include <vector>
    3.  
    4. typedef struct __taghocsinh
    5. {
    6.     int tuoi;
    7.     int gioitinh;
    8.     char ten[ 30 ];
    9. } HOCSINH;
    10.  
    11. using namespace std;
    12.  
    13. int main()
    14. {
    15.     vector< HOCSINH > lop12( 5 );
    16.  
    17.     for( int x = 0, SIZE = lop12.size(); x < SIZE; ++x )
    18.     {
    19.         cout << lop12[ x ].ten << endl;
    20.     }
    21.  
    22.     for( vector< HOCSINH >::const_iterator b = lop12.begin(), e = lop12.end(); b != e; ++b )
    23.     {
    24.         cout << b->ten << endl;
    25.     }
    26.  
    27.     return 0;
    28. }
    Đọc xong chắc cậu hiểu.

  3. #3
    Ngày gia nhập
    10 2008
    Nơi ở
    Quảng Trị
    Bài viết
    369

    Trích dẫn Nguyên bản được gửi bởi rox_rook Xem bài viết
    - vector<> rỗng có gì đâu mà in ra ?
    Thì phần nhập vào mình ko viết để tránh rắc rồi thôi mà

    Trích dẫn Nguyên bản được gửi bởi rox_rook Xem bài viết
    C++ Code:
    1. /* ... */
    2.     for( vector< HOCSINH >::const_iterator b = lop12.begin(), e = lop12.end(); b != e; ++b )
    3.     {
    4.         cout << b->ten << endl;
    5.     }
    6. /* ... */
    Mình nghĩ là

    C++ Code:
    1.     for( vector< HOCSINH >::const_iterator b = lop12.begin(), e = lop12.end(); b != e; b++ )

    thì đúng hơn

    Đọc xong chắc cậu hiểu.
    Mình hiểu mà, thanks
    Born to walk against the wind... Born to hear my name...
    Stand and fight... Live by your heart...
    Always one more try... I'm not afraid to die...
    Stand and fight... say what you feel...
    Born with a heart of steel ...

  4. #4
    Ngày gia nhập
    01 2009
    Bài viết
    201

    cậu sử dụng con trỏ itertor ấy,duyệt rất nhanh

  5. #5
    Ngày gia nhập
    01 2009
    Bài viết
    89

    ngắn gọn.

    C++ Code:
    1.     for (int i=0;i<lop12.size();i++)
    2.     {
    3.         cout<<lop12[i].ten<<endl;
    4.     }

  6. #6
    Ngày gia nhập
    10 2008
    Nơi ở
    Quảng Trị
    Bài viết
    369

    Mặc định Duyệt hết các phần tử của Vector

    Trích dẫn Nguyên bản được gửi bởi ngocbig™ Xem bài viết
    ngắn gọn.

    C++ Code:
    1.     for (int i=0;i<lop12.size();i++)
    2.     {
    3.         cout<<lop12[i].ten<<endl;
    4.     }
    Thế lỡ mình erase đi 1 phần tử nào đó thì đoạn CT trên chạy có đúng ko bạn?
    Born to walk against the wind... Born to hear my name...
    Stand and fight... Live by your heart...
    Always one more try... I'm not afraid to die...
    Stand and fight... say what you feel...
    Born with a heart of steel ...

  7. #7
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    ngắn gọn.
    Code của ngocbig rất slow ! Cậu gọi size() đúng bằng size lần.
    Mình nghĩ là
    ....
    ++b nhanh hơn b++.
    Thế lỡ mình erase đi 1 phần tử nào đó thì đoạn CT trên chạy có đúng ko bạn?
    Cậu erase thế nào ? Đoạn trên gọi tới size() hoặc b.end(), b.begin() thì mấy cái operation trước đó nó sẽ tự update các giá trị này ? Trường hợp nào mà cậu nghĩ là sai thì cho tui một ví dụ thử, nói vậy khó mà biết đúng chính xác hay không.

  8. #8
    Ngày gia nhập
    09 2006
    Nơi ở
    /usr/share/.hack@
    Bài viết
    1,433

    1. prefix luôn luôn nhanh hơn postfix (không tin đo thời gian thực sẽ rõ)
    2. Nếu gọi size() như ngocbig thì số lần gọi sẽ bị lũy thừa (pow(x,x)). Còn nếu dùng interator trong template thì các operation sẽ auto-update các giá trị liên quan.

    Bác nào không tin cứ đo thời gian rồi debug thí nghiệm chắc sẽ rõ.
    None!

  9. #9
    Ngày gia nhập
    10 2008
    Nơi ở
    Quảng Trị
    Bài viết
    369

    Nhưng mà nếu dùng ++b thì mất đi phần tử đầu tiên mà
    vì nó tăng b lên mới lấy giá trị của b

    Cậu erase thế nào ? Đoạn trên gọi tới size() hoặc b.end(), b.begin() thì mấy cái operation trước đó nó sẽ tự update các giá trị này ? Trường hợp nào mà cậu nghĩ là sai thì cho tui một ví dụ thử, nói vậy khó mà biết đúng chính xác hay không.
    Ý mình muốn hỏi là ví dụ trong vector đó có 5 phần tử thì khi mình gọi

    Code:
    lop12.erase(lop12.begin()+3)
    thì các phần tử nằm sau phần tử bị xóa có dồn lên ko? hay chổ phần tử bị xóa sẽ trống????

    Edit: Cho mình hỏi thêm là nếu mình duyệt theo cách
    C++ Code:
    1.     for( vector< HOCSINH >::const_iterator b = lop12.begin(), e = lop12.end(); b != e; ++b )
    2.     {
    3.         cout << b->ten << endl;
    4.     }

    thì làm sao để biết mình đang đứng ở phần tử thứ mấy của vector đó?
    Đã được chỉnh sửa lần cuối bởi nguyenbinh07 : 17-03-2009 lúc 03:42 PM.
    Born to walk against the wind... Born to hear my name...
    Stand and fight... Live by your heart...
    Always one more try... I'm not afraid to die...
    Stand and fight... say what you feel...
    Born with a heart of steel ...

  10. #10
    Ngày gia nhập
    04 2008
    Bài viết
    336

    Nhưng mà nếu dùng ++b thì mất đi phần tử đầu tiên mà
    vì nó tăng b lên mới lấy giá trị của b
    vòng lặp for xử lý lệnh sau dấu " ; " thứ 2 khi kết thúc vòng lặp
    ++b tương đương ( nhưng nhanh hơn ) b++ nếu chỉ đứng 1 mình.

    thì làm sao để biết mình đang đứng ở phần tử thứ mấy của vector đó?
    iterator là con trỏ thôi vì thế cậu có thể xài các phép toán trên con trỏ
    C++ Code:
    1. for( vector< HOCSINH >::const_iterator b = lop12.begin(), e = lop12.end(); b != e; ++b )
    2.     {
    3.         cout << b->ten << endl;
    4.         cout<<"Toi la phan tu thu: "<<b - lop12.begin()<<"\n";
    5.     }
    code ra gió bão

Các đề tài tương tự

  1. lỗi no matching function for call to `vector::vector(vector)'
    Gửi bởi ngonchanloi89 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 3
    Bài viết cuối: 10-11-2013, 11:25 AM
  2. Trả lời: 6
    Bài viết cuối: 31-07-2013, 07:51 PM
  3. Cách thức duyệt tiền tự trên cây khi duyệt từ con trái nhất rồi sang anh em ruột phải?
    Gửi bởi tyrant trong diễn đàn Thắc mắc CTDL & Giải thuật
    Trả lời: 0
    Bài viết cuối: 14-09-2011, 10:53 AM
  4. Kỹ thuật C++ Vector, thêm một phần tử vào vector
    Gửi bởi ngductong trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 30-05-2010, 11:33 PM
  5. Duyệt đệ quy trong Vector như thế nào?
    Gửi bởi zzronn trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 12
    Bài viết cuối: 17-11-2008, 10:36 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn