Advertisement
Guest User

Untitled

a guest
Apr 23rd, 2017
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.05 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <functional>
  4. #include <algorithm>
  5.  
  6. //A quicksort algoritmus implementálásakor felhasználtam a következo kodot: http://www.cplusplus.com/forum/beginner/119660/
  7. /**, amelyet átalakítottam, hogy az indices tömböt rendezze, de a Datán történjenek az összehasonlítások.
  8. Ez az átalakítás nem volt sikeres, és foképp ebben kérném a segítségedet!
  9. **/
  10.  
  11. template <class T>
  12. class  IndexVector {
  13. private:
  14.     size_t sequenceNum = 0; //ezt állítgatva tudjuk befolyásolni, hogy melyik szemüvegen keresztül lássuk a tömböt. A default érték a Data eredeti sorrendje.
  15.     size_t number_of_sequences = 1; //hány darab rendezettsége létezik a tömbnek.
  16.     size_t _size = 0;
  17.     std::vector<T> Data;
  18.     std::vector<std::vector<size_t>> indices; //nem kell kézi eroforráskezelés.
  19.     std::vector<std::function<bool(T const &, T const &)>> sorting_functions;
  20. public:
  21.     IndexVector(){
  22.         indices.push_back(std::vector<size_t>());
  23.         sorting_functions.push_back(std::function<bool(T const &, T const &)>());
  24.     }
  25.     IndexVector(size_t size): _size(size), Data(size) {
  26.         indices.push_back(std::vector<size_t>());
  27.         sorting_functions.push_back(std::function<bool(T const &, T const &)>());
  28.         size_t i = 0;
  29.         std::generate( indices.back().begin(), indices.back().end(), [&i]() { return i++; } );
  30.     }
  31.     IndexVector(size_t size, const T & initial): _size(size), Data(initial) {
  32.         indices.push_back(std::vector<size_t>());
  33.         sorting_functions.push_back(std::function<bool(T const &, T const &)>());
  34.         size_t i = 0;
  35.         std::generate( indices.back().begin(), indices.back().end(), [&i]() { return i++; } );
  36.     }
  37.  
  38.     size_t get_size() const {
  39.         return _size;
  40.     }
  41.     void set_sequenceNum(size_t num){ //kiválaszt rendezettséget. num=0 a default. A kiválasztott rendezettség az operator[]-nak lesz nagyon fontos.
  42.         sequenceNum = num;
  43.     }
  44.     void push_back(const T& value){ //elrontja a rendezettségeket! Hívása után szükséges a felhasználónak meghívni a sort_all függvényt!
  45.         for ( auto& item : indices ) //minden rendezettséghez hozzáadok egy plusz elemet, aminek az értéke _size
  46.         {
  47.             item.push_back(_size);
  48.         }
  49.  
  50.         Data.push_back(value); //adat betöltése
  51.         ++_size; // tömbméret növekedésének jelzése
  52.     }
  53.     void sort_all(){ //felhasználó dolga, hogy feltöltés után újrarendezzen.
  54.         size_t tmp = sequenceNum; //mentés
  55.         for(size_t i = 1; i<number_of_sequences; i++){
  56.             set_sequenceNum(i); //ideiglenesen át kell állítani, mert a quicksort() a sequenceNum indexu rendezést rendezi.
  57.             quickSort( 0 , _size-1 );
  58.         }
  59.         set_sequenceNum(tmp); //betöltés
  60.     }
  61.     void add_sort(std::function<bool(T const &, T const &)> fptr = std::greater<T>()){
  62.         sorting_functions.push_back(fptr); //elmentem a rendezofuggvenyt
  63.  
  64.         indices.push_back( std::vector<size_t>(_size) ); //Felveszek egy új indextömböt a fuggvenyhez.
  65.  
  66.         size_t i = 0;
  67.         std::generate( indices.back().begin(), indices.back().end(), [&i]() { return i++; } ); //ezt feltöltöm 0,1,2,3,4,5....-el
  68.  
  69.         number_of_sequences++; //Ebben ebben tagváltozóban jelzem, hogy létrejött egy új rendezés.
  70.         quickSort(0 , _size-1); //Végül rendezem a sorrendet a fuggveny szerint.
  71.     }
  72.  
  73.  
  74.  
  75.     T& operator[](size_t idx){ //írás
  76.         if(idx+1 > _size){ //túlindexelés esetén, nyúlik a tömb 0-ás értékekkel, amiket majd felülír a felhasználó.
  77.             for(size_t i = 0; i < idx + 1 - _size; i++ ){ //pl: idx = 6, _size = 4. -> [3]-ig hivatkozható. 6-3 = 3 push_back kell.
  78.                 push_back(0);
  79.             }
  80.         }
  81.         return Data[indices[sequenceNum][idx]];
  82.     }
  83.  
  84.     /**Ez a függvény SOSE hívódik! Miért nem? Olvasásra is az író op[] hivodik.
  85.     Azért tartom szükségesnek, mert túlindexelés esetén csak akkor szabad nyúlnia a tömbnek, ha írok bele.
  86.     Hogyan lehetne lekezelni ezt a mukodési hibát?**/
  87.     /*
  88.     const T & operator[](size_t idx) const { //olvasás
  89.         return Data[indices[sequenceNum][idx]];
  90.     }
  91. */
  92.  
  93.     /**Ez az a fuggveny, ami futasi idoben elszall. Sajnos nem tudtam kideriteni, hogy miert...**/
  94.     //beépített rendezofuggvények nem használhatóak, mert azok vagy az indices-t vagy a Datát rendeznék.
  95.     //Nekem arra lenne szükségem, hogy a indices-t rendezzék, de az Datán végezzem el az összehasonlítást,
  96.     //amire az indeces-on keresztül hivatkozok.
  97.     //Sajnos saját magamnak kell implementálnom az algoritmust:
  98.     void quickSort(int start, int end){
  99.         if (start < end)
  100.             {
  101.                 int p = partition(start, end);
  102.  
  103.                 quickSort(start, p - 1);
  104.  
  105.                 quickSort(p + 1, end);
  106.             }
  107.     }
  108.  
  109.     T partition(int start, int end){
  110.         //szokványos quicksort algoritmus annyi különbséggel,
  111.         //hogy minden összehasonlításnál az indices-on keresztül hivatkozok a Datára,
  112.         //miközben csak az Indices-t rendezem.
  113.         T pivotValue = Data[indices[sequenceNum][0]]; /**ITT SZÁLL EL A PROGRAM**/
  114.         int pivotPosition = indices[sequenceNum][0];
  115.  
  116.         for (int pos = indices[sequenceNum][start + 1]; pos <= end; pos++){
  117.             if (sorting_functions[sequenceNum](Data[pos], pivotValue)){
  118.  
  119.                 std::swap(indices[sequenceNum][pivotPosition + 1], indices[sequenceNum][pos]);
  120.                 std::swap(indices[sequenceNum][pivotPosition], indices[sequenceNum][pivotPosition + 1]);
  121.                 pivotPosition = indices[sequenceNum][pivotPosition + 1];
  122.             }
  123.         }
  124.         return pivotPosition;
  125.     }
  126. };
  127. /**Ezeket a függvényeket etetném meg tesztelésképpen az add_sort-tal, de nem eszi meg oket.**/
  128. template <typename D>
  129. bool greater(D a, D b){ //teszteléshez majd
  130.         return a>b;
  131. }
  132. template <typename G>
  133. bool less(G a, G b){
  134.  
  135.         return b>a;
  136. }
  137. int main(){
  138.     IndexVector<int> test;
  139. //push_backel is feltöltheto a tomb
  140. //    test.push_back(5);
  141. //    test.push_back(4);
  142. //    test.push_back(7);
  143. //    test.push_back(1);
  144. //    test.push_back(4);
  145. //    test.push_back(2);
  146. //    test.push_back(6);
  147. //    test.push_back(3);
  148. //    test.push_back(8);
  149. //    test.push_back(12);
  150. //    test.push_back(11);
  151. //    test.push_back(14);
  152. //    test.push_back(9);
  153. //    test.push_back(13);
  154. //    test.push_back(10);
  155. //és túlindexeléssel is.
  156. //túlindexelés esetén a tömbhoz push_backelödik egy 0as elem, ami majd felul lesz írva.
  157. test[0] = 5;
  158. test[1] = 4;
  159. test[2] = 7;
  160. test[3] = 1;
  161. test[4] = 4;
  162. test[5] = 2;
  163. test[6] = 6;
  164. test[7] = 3;
  165. test[8] = 8;
  166. test[9] = 12;
  167. test[10] = 11;
  168. test[11] = 14;
  169. test[12] = 9;
  170. test[13] = 13;
  171. test[14] = 10;
  172.  
  173. /**erre elszáll a program és ez így van jól.**/
  174. //std::cout << test[20];
  175. /**erre megnyúlik a tömb, pedig ezt nem akartam! Csak olvasásra szabad nyúlnia a tömbnek!**/
  176. //test[20];
  177.  
  178. //a sequenceNum default értéke 0, ami mindig a tömb eredeti sorrendje.
  179.     std::cout << "feltoltesi sorrend: ";
  180.     for (size_t i = 0; i<test.get_size(); i++ ){ //0-ás sequence
  181.         std::cout << test[i] << " ";
  182.     }
  183.     std::cout << std::endl << std::endl;
  184.  
  185.  
  186.     test.set_sequenceNum(1);
  187.     /**rossz a paramétertípus. miért? Rosszul hívom? Miért nem eszi meg az add_sort()?**/
  188.     //test.add_sort(greater);
  189.  
  190.     /**ITT SZÁLL EL A PROGRAM**/
  191.     test.add_sort(); //1-es sequence: greater (default add_sort paraméter)
  192.     std::cout << "csokkeno sorrend: ";
  193.     for (size_t i = 0; i<test.get_size(); i++ ){
  194.         std::cout << test[i] << " ";
  195.     }
  196.     std::cout << std::endl << std::endl;
  197.  
  198.  
  199.     test.set_sequenceNum(2);
  200.     /**a lambda függvényt pedig megeszi az add_sort()**/
  201.     test.add_sort([] (int a, int b) {return a < b;}); //2-es sequence: less
  202.     std::cout << "novekvo sorrend: ";
  203.     for (size_t i = 0; i<test.get_size(); i++ ){
  204.         std::cout << test[i] << " ";
  205.     }
  206.     std::cout << std::endl << std::endl;
  207. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement