رفتن به مطلب
جامعه‌ی برنامه‌نویسان مُدرن ایران

برنامه نویسی

  • نوشته‌
    20
  • دیدگاه
    10
  • مشاهده
    2,534

مشارکت‌کنندگان این وبلاگ

استفاده از کانتینر Doubly Linked List و Iteration و Sort

فرهاد شیری

81 بازدید


یکی از پرکاربردترین کانتینر ها بعد از vector در زبان سی پلاس پلاس کانتینر List می باشد، که در این زبان به صورت یک doubly link list پیاده سازی شده است.

 به همین علت در صورتی که بدنبال لیستی هستید که بتوانید درج و حذف های مکرر در قسمت های مختلف لیست انجام دهید، قطعا از کانتینر List باید استفاده کنید.
در مثال زیر یک نمونه ساده استفاده از List و Vector را مشاهده میکنید که با استفاده از الگوریتم های مختلف Iterator لیست ها را مورد پیمایش قرار داده ایم.
نکته : برای اجرای کدها باید از C++‎‎‎‎‎11 به بعد استفاده کنید.

#include <iostream>
#include <list>
#include <iterator>
#include <algorithm>
#include <vector>
 
 
#define SEP_LINE()  std::cout << "\n-----------------------" << '\n'
 
 
struct Table {
    int i;
    bool operator<(const Table& tbl1 ){
        return (tbl1.i < i);
    }
    bool operator()(const Table& tbl1 , const Table& tbl2){
        return (tbl1.i < tbl2.i);
    }
    friend std::ostream& operator<<(std::ostream& os ,const Table& tbl){
      os << tbl.i  ;
      return os;
    }
};
using list_table = std::list<Table>;
using vector_table = std::vector<Table>;
 
 
template<class Tp>
class OutputStream :std::ostream_iterator<Tp>{
public:
    using ostream_ptr = std::ostream_iterator<Tp>;
    using list_t = std::list<Tp>;
    using list_itr = list_table::iterator;
    using vector_itr = vector_table::const_iterator;
 
 
    OutputStream(const char* format , std::ostream& os_type) : std::ostream_iterator<Tp>(os_type , format) {
    }
 
 
    template<typename T>
    void outPut(T table){
        std::cout << table << "-" ;
    }
 
 
    /*print container element by for each in Modern C++‎‎‎‎‎‎‎11  */
    template<typename T>
    void print_forech1(T container){
        for(const auto& element : container)
            outPut(element);
    }
 
 
    /*print container element by copy algorithm in C++‎‎‎‎‎‎‎98-ISO*/
    template<typename T>
    void operator()(T container){
        std::copy(container.begin(),container.end() , *this->get());
    }
 
 
    /*print container element by for_each algorithm in C++‎‎‎‎‎‎‎98-ISO*/
    template<typename T>
    void print_forech2(T container){
        for_each(container.begin() , container.end() , [&](const Tp table){ outPut(table); });
    }
 
 
    /*print container element by for iterator in C++‎‎‎‎‎‎‎98-ISO*/
    template<class T>
    void print_forech3(T container){
        for(list_itr element=container.begin() ; element != container.end() ; ++element)
            outPut(*element);
    }
 
 
        /*print container element by while iterator in C++‎‎‎‎‎‎‎98-ISO*/
    template<class T>
    void print_forech4(T container){
        vector_itr element=container.cbegin() ;
        while(element != container.cend())
            outPut(*element++);
    }
private:
    const ostream_ptr* get() const {
       return static_cast<const ostream_ptr*>(this);
    }
};
 
 
int main()
{
    OutputStream<Table> output("-" , std::cout);
    list_table tblList {{4},{3},{1},{5},{2},{6},{8},{9},{10},{7}};
 
 
    /* sort by default */
    tblList.sort();
    std::cout << "sort list by overloaded operator < in structure object." << '\n';
    output(tblList);
    SEP_LINE();
 
 
    /* sort by functor */
    tblList.sort(Table());
    std::cout << "sort list by overloaded operator () in structure object." << '\n';
    output.print_forech3(tblList);
    SEP_LINE();
 
 
    /* sort by lambda comparator  */
    tblList.sort([](Table& tbl1 , Table& tbl2){return (tbl1.i < tbl2.i);});
    std::cout << "sort list by lambda functor comparator." << '\n';
    output.print_forech2(tblList);
    SEP_LINE();
 
 
    std::cout << "print sorted list elements by for each C++‎‎‎‎‎‎‎11." << '\n';
    output.print_forech1(tblList);
    SEP_LINE();
 
 
    /* create vector container and sort by functor
       because std::vector is not member function sort.
       vector container sorted by std::sort algorithm
    */
    vector_table vecTable {{14},{13},{11},{15},{12},{16},{18},{19},{10},{17}  };
    std::sort(vecTable.begin() , vecTable.end() , Table()) ;
    std::cout << "print sorted vector elements by while loop iteration ." << '\n';
output.print_forech4(vecTable);
    SEP_LINE();
 
 
   return 0;
}

به علت واضح بودن کدها ار توضیح اضافی خودداری میکنم لطفا در صورتی که ابهامی در بخشی وجود دارد خواهشمند است در همین پست اعلام فرمایید.

موفق باشید.



0 دیدگاه


نظرهای پیشنهاد شده

هیچ دیدگاهی برای نمایش وجود دارد.

مهمان
این نوشته قفل شده و امکان ارسال دیدگاه غیرفعال است.
  • کاربران آنلاین در این صفحه   0 کاربر

    هیچ کاربر عضوی،در حال مشاهده این صفحه نیست.

×
×
  • جدید...