Konsep dasar dari pustaka C ++ standar

Artikel ini mendefinisikan konsep dasar dari pustaka C ++ standar. Itu diberikan untuk merujuknya di masa depan.

Bagian terbesar dari C ++ Standard Library adalah STL (Standard Template Library). Perpustakaan STL berisi lima jenis komponen utama:

  • wadah : mengontrol satu set objek dalam memori.
  • iterator : menyediakan algoritme untuk algoritme untuk mengakses konten wadah.
  • algoritme : mendefinisikan prosedur komputasi.
  • function object : mengenkapsulasi fungsi dalam objek untuk digunakan oleh komponen lain.
  • adaptor : mengadaptasi komponen untuk menyediakan antarmuka yang berbeda.



Semua komponen memenuhi sejumlah persyaratan, oleh karena itu, dalam perjanjian yang baik satu sama lain.

Dari definisi wadah, maka setiap struktur data pengguna adalah wadah. Dalam kasus kami, kontainer memiliki struktur data standar , seperti daftar, vektor, kamus, dan banyak lainnya. Persyaratan formal untuk wadah cukup luas, tetapi aturan dasarnya adalah akses ke elemen. Akses ke elemen wadah dilakukan melalui objek khusus - iterator (lihat di bawah). Anda mungkin tidak tahu bagaimana elemen-elemen wadah berada dalam memori, tetapi Anda tahu pasti bahwa iterator dapat diulangi secara berurutan, dan masing-masingnya akan memberikan akses ke elemen tersebut. Sebuah iterator yang menunjuk ke elemen pertama dapat diperoleh dengan menggunakan iterator begin () method ; wadah. Sebuah iterator yang menunjuk ke elemen terakhir dapat diperoleh dengan menggunakan metode iterator end (); wadah. Dengan kata lain, iterator terletak dalam setengah interval (atau setengah- segmen), yang dapat ditulis secara formal sebagai [awal, akhir). Contoh pernyataan wadah:

struct a_container { struct an_iterator; an_iterator begin(); an_iterator end(); }; 

Standar C ++ 20 yang diharapkan menyarankan penggunaan struktur yang merangkum setengah rentang - rentang


Iterator adalah objek yang menyediakan akses ke elemen wadah dan memungkinkan mereka untuk disortir. Iterator adalah properti dari wadah. Dalam implementasi pertama dari pustaka standar C ++, iterator diimplementasikan sebagai pointer ke elemen kontainer. Dalam implementasi modern, ini adalah kelas yang merangkum pointer ke objek kontainer.

Persyaratan utama untuk iterator adalah adanya operator dereferencing dan increment. Di bawah ini adalah deklarasi wadah dengan iterator.

 template<typename TYPE> struct a_container { struct an_iterator { void operator++(); TYPE& operator*(); }; an_iterator begin(); an_iterator end(); }; 

Saya tidak dapat memberikan definisi algoritma yang lebih baik daripada standar: algoritma adalah urutan tindakan yang mengarah ke hasil yang diinginkan dalam sejumlah langkah terbatas .

Dalam kasus STL, algoritma diimplementasikan oleh fungsi templat yang mengambil setengah interval iterator sebagai parameter input. Tanda tangan umum dari algoritma ini dijelaskan sebagai berikut:

 template<typename ITERATOR, typename RESULT> RESULT an_algorithm(ITERATOR first, ITERATOR last, ...); 

Dalam deklarasi kelas, Anda bisa mengganti operator (). Jika operator ini diganti dalam kelas, maka objek dari kelas ini menerima properti fungsi (mereka dapat digunakan sebagai fungsi). Objek semacam itu disebut fungsional atau functors . Lebih mudah untuk menggunakan functors ketika suatu fungsi harus memiliki "memori", serta mengganti pointer ke fungsi.
Dimulai dengan standar C ++ 11, ada kemungkinan notasi singkat tentang fungsi - fungsi lambda.
Tidak ada persyaratan khusus untuk functors. Kecuali kadang-kadang pewarisan dari fungsi functor mungkin diperlukan (hingga standar C ++ 11 - unary_function atau binary_function). Contoh kecil implementasi functor:

 template<typename TYPE> struct plus{ TYPE operator ()(const TYPE& p1, const TYPE& p2) const{ return p1 + p2; } }; 

STL juga menawarkan sejumlah kelas dan fungsi (fungsi) yang mengubah antarmuka ke yang benar. Secara khusus, ada adaptor tumpukan yang mengimplementasikan tumpukan berdasarkan wadah. Sebagai contoh, kita dapat mempertimbangkan adaptor fungsi biner menjadi fungsi unary (saat ini fungsi ini sudah tidak digunakan lagi dalam standar C ++):

 template<typename BIDIRECTIONAL_FUNCTION, typename TYPE> class bind1st { BIDIRECTIONAL_FUNCTION _bf; TYPE _first; public: bind1st(BIDIRECTIONAL_FUNCTION bf, TYPE first): _bf(bf), _first(first) {} TYPE operator()(const TYPE& p) const { return _bf(_first, p); } }; 

Untuk membaca mandiri


  1. C ++ 20 konsep di github
  2. Referensi C ++
  3. C ++ Pengembangan Aplikasi
  4. Range-v3, proposal untuk standar

Source: https://habr.com/ru/post/id434986/


All Articles