Từ 1 tới 7 trên tổng số 7 kết quả

Đề tài: các phương thức copy, swap,.. trong STL Vector có tác dụng gì?

  1. #1
    Ngày gia nhập
    10 2008
    Nơi ở
    sài gòn
    Bài viết
    422

    Mặc định các phương thức copy, swap,.. trong STL Vector có tác dụng gì?

    Code:
    // cont/vector1.cpp
    
       #include <iostream>
       #include <vector>
       #include <string>
       #include <algorithm>
       using namespace std;
    
       int main()
       {
    
           //create empty vector for strings
           vector<string> sentence;
    
           //reserve memory for five elements to avoid reallocation
           sentence.reserve(5);
    
           //append some elements
           sentence.push_back("Hello,");
           sentence.push_back("how");
           sentence.push_back("are");
           sentence.push_back("you");
           sentence.push_back("?");
    
           //print elements separated with spaces
           copy (sentence.begin(), sentence.end(),
                 ostream_iterator<string>(cout," "));
           cout << endl;
    
           //print ''technical data''
           cout << " max_size(): " << sentence.max_size() << endl;
           cout << " size():     " << sentence.size()     << endl;
           cout << " capacity(): " << sentence.capacity() << endl;
    
           //swap second and fourth element
           swap (sentence[1], sentence [3]);
    
           //insert element "always" before element "?"
           sentence.insert (find(sentence.begin(),sentence.end(),"?"),
                            "always");
    
           //assign "!" to the last element
           sentence.back() = "!";
    
           //print elements separated with spaces
           copy (sentence.begin(), sentence.end(),
                 ostream_iterator<string>(cout," "));
           cout << endl;
    
           //print "technical data" again
           cout << " max_size(): " << sentence.max_size() << endl;
           cout << " size():     " << sentence.size()     << endl;
           cout << " capacity(): " << sentence.capacity() << endl;
    
       }
    không rõ cái hàm copy nghĩa là gì vậy,mình đọc thấy ý nghĩa nó là thêm khoảng trống cho chuỗi nhưng không biết cụ thể thì tại sao nó lại chạy từ đầu đến cuối nhỉ và cái iterator để làm gì

    copy (sentence.begin(), sentence.end(),
    ostream_iterator<string>(cout," "));


    Phương thức
    //swap second and fourth element
    swap (sentence[1], sentence [3]);


    //insert element "always" before element "?"
    sentence.insert (find(sentence.begin(),sentence.end(),"?"),
    "always");


    nằm ở trong thư viện nào vậy
    Đã được chỉnh sửa lần cuối bởi haian : 21-12-2008 lúc 11:17 PM.

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

    - Dùng copy trong trường hợp trên theo Scott Meyers là poor programming vì nó tối nghĩa, in ra 1 cái gì thì nên dùng vòng lặp for nhưng xài STL quen rồi thì lại thấy dùng vòng lặp for hay copy một ostream_iterator cũng chẳng có vấn đề gì.
    - Đầu tiên em muốn hiểu rõ thì em phải coi cái class ostream_iterator nó như thế nào :
    C++ Code:
    1.  
    2. template< class T, class charT = char, class traits = char_traits< charT > >
    3. class ostream_iterator :
    4.     public iterator< output_iterator_tag, void, void, void, void >
    5. {
    6.     basic_ostream< charT, traits >*  out_stream;
    7.     const charT*                    delim;
    8.  
    9. public:
    10.     typedef charT                          char_type;
    11.     typedef traits                         traits_type;
    12.     typedef basic_ostream< charT,traits >  ostream_type;
    13.  
    14.     ostream_iterator( ostream_type& s )
    15.         : out_stream( &s ), delim( 0 )
    16.     {   }
    17.     ostream_iterator( ostream_type& s, const charT* delimiter)
    18.         : out_stream( &s ), delim(delimiter)
    19.     {   }
    20.     ostream_iterator(const ostream_iterator<T,charT,traits>& x)
    21.         : out_stream( x.out_stream ), delim( x.delim )
    22.     {   }
    23.     ~ostream_iterator()
    24.     {   }
    25.  
    26. public :
    27.     ostream_iterator< T, charT, traits >& operator =( const T& value )
    28.     {
    29.         *out_stream << value;
    30.         if( delim != 0 )
    31.             *out_stream << delim;
    32.         return *this;
    33.     }
    34.  
    35.     ostream_iterator< T, charT, traits >& operator*()
    36.     {
    37.         return *this;
    38.     }
    39.  
    40.     ostream_iterator< T, charT, traits >& operator++()
    41.     {
    42.         return *this;
    43.     }
    44.  
    45.     ostream_iterator< T, charT, traits >& operator++(int)
    46.     {
    47.         return *this;
    48.     }
    49. };
    - Em cần chú ý các constructor, toán tử gán và basic_ostream< charT, traits >* out_stream. Toán tử gán rõ ràng là in ra 1 đối tượng "value" nào đó cùng 1 delim.
    Còn đây là hàm copy :
    C++ Code:
    1. template< typename _II, typename _OI >
    2. static _OI copy( _II __first, _II __last, _OI __result )
    3. {
    4.     typedef typename iterator_traits<_II>::difference_type _Distance;
    5.     for( _Distance __n = __last - __first; __n > 0; --__n )
    6.     {
    7.           *__result = *__first;
    8.           ++__first;
    9.           ++__result;
    10.     }
    11.  
    12.     return __result;
    13. }
    Chú ý dòng : *__result = *__first;
    Nó sẽ gọi toán tử gán của loại _OI, mà hàm copy nhận vào 1 ostream_iterator tức là thằng __result chính là ostream_iterator đó, mà toán tử gán làm gì thì như trên em đã rõ. Và copy sẽ thực hiện phép gán cho mỗi phần tử của 1 container vì vậy nó sẽ xuất ra toàn bộ giá trị của container, thế thôi ! Easy huh !
    - Cho hàm swap thì chỗ đó quá dễ hiểu, chỉ là đổi chỗ 2 phần tử của 1 loại dữ liệu bất kì thôi nó nằm trong #include <algorithm>
    - Thằng find của cũng vậy, nó sẽ trả về 1 iterator của container đó :
    C++ Code:
    1. template< typename _InputIterator, typename _Tp >
    2. inline _InputIterator find(
    3.     _InputIterator __first,
    4.     _InputIterator __last,
    5.     const _Tp&    __val,
    6.     input_iterator_tag
    7. )
    8. {
    9.     while ( __first != __last && !( *__first == __val ) )
    10.         ++__first;
    11.    
    12.     return __first;
    13. }
    Còn hàm insert của vector thì nó sẽ insert tại vị trị iterator đó 1 phần tử nào đó.
    C++ Code:
    1. iterator insert ( iterator position, const T& x );
    2.     void insert ( iterator position, size_type n, const T& x );
    3. template <class InputIterator>
    4.     void insert ( iterator position, InputIterator first, InputIterator last );

  3. #3
    Ngày gia nhập
    10 2008
    Nơi ở
    sài gòn
    Bài viết
    422

    ý của em là cái swap và cái copy trong thư viện nào thế
    cố gắng

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

    #include <algorithm>, anh đã ghi ở trên rồi mà ?

  5. #5
    Ngày gia nhập
    10 2008
    Nơi ở
    sài gòn
    Bài viết
    422

    swap(c1,c2) Same (as global function)
    em thấy nó ở trong quyển C++ Standard Library, A Tutorial and Reference
    hình như nó trong thư viện #include <deque> chứ anh

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

    Mặc định các phương thức copy, swap,.. trong STL Vector có tác dụng gì?

    Trích dẫn Nguyên bản được gửi bởi haian Xem bài viết
    em thấy nó ở trong quyển C++ Standard Library, A Tutorial and Reference
    hình như nó trong thư viện #include <deque> chứ anh
    Cậu này chắc đọc không đọc từ đầu.
    Cuốn đó đã đọc là phải hết cả trang từ đầu đến cuối. Không được bỏ sót đoạn nào đặc biệt là chữ in nghiêng với mấy comment trong code của nó.
    Cái đoạn swap nó có cả một mục rõ ràng về scope của swap khi truy xuất trong thư viện.
    Học vù vù như gió là không chấp nhận được đâu
    None!

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

    - Nói thật anh trả lời cho em mà anh bực cả mình !
    - Dù cho em thực sự không biết thì cũng không thể nào mà em suy ra nó trong <deque> được cả !!! ! Các hàm như find, swap khi không có invoking object thì nó chỉ là stand-alone function thôi làm sao mà trong <deque> được ? Thứ 2 mấy tra cứu mấy hàm trong STL thì chỉ cần google đọc 1 tí là biết nó ở đâu thôi chứ có khó gì đâu nào ! Với lại anh vừa mới nói ở trên quay xuống em hỏi câu hỏi y chang !

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. Viết hàm Swap trong C
    Gửi bởi maxvien trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 28
    Bài viết cuối: 19-04-2012, 09:16 PM
  3. code phần swap sao không swap đc. Xem giùm mình vậy
    Gửi bởi lastvampire trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 7
    Bài viết cuối: 28-11-2010, 07:37 PM
  4. Bài tập C++ Hàm swap trong dslk.
    Gửi bởi trihn_kt trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 7
    Bài viết cuối: 17-04-2010, 08:18 AM
  5. vector trong lập trình OOP là gì? vector trên C++ là gì?
    Gửi bởi tunglong123 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 01-05-2009, 12:03 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