Website Summary Files Commits Branches @commit @diff @stats
path: root / Seminar05 / list-cheat-sheet.cpp
blob: fd68300ae6e8114481139f126b64afe869617f20 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#include<list>
#include<iostream>
#include"../Seminar04/linked-list-utils.h"

// Пример как да напишем една и съща функция
// Чрез итератори и чрез пойнтър представянето

// Функцията map приема свързан списък и функция която приема int
// и прилага функцията върху всеки елемент от списъка
void mapOnSTLList(std::list<int>& ll, void (*f)(int&)) {
    for(int& elem : ll)
        f(elem);
}

void mapOnListRepresentedAsPointer(LinkedListNode<int>* ll, void (*f)(int&)) {
    while(ll) {
        f(ll->data);
        ll = ll->next;
    }
}

//.....

void printList(const std::list<int>& myList, const char* msg) {
    if(msg != "")
        std::cout << msg << std::endl;
    
    // range based for loop който извежда всички елементи на списъка
    for(const int& elementInList : myList) 
        std::cout << elementInList << " ";
    std::cout << std::endl;
}

int main() {
    std::list<int> myList;

    const auto f = myList.begin();

    // Добави елемент в края на листа
    for (int i = 0; i < 10; i++)
        myList.push_back(i);

    // Добави елемент в началото на листа
    for(int i = 10; i < 20; i++)
        myList.push_front(i);

    printList(myList, "Added the elements from [0..9] to the back and [10..19] to the front");

    // Можем да изтриваме елементи на позиция
    myList.erase(myList.begin());
    printList(myList, "Erased the first element");

    // Удобен начин да обърнем списък
    myList.reverse();
    printList(myList, "Reversed the linked list");

    // Можем да премахнем елемент
    myList.remove(10);
    printList(myList, "After removing 10 from the list");

    // Можем да премахнем всички елементи, които отговарят на някакъв предикат
    // Аргумента на remove_if е булева функция. Ще останат само тези за които условието е лъжа.
    myList.remove_if([](const int& currentElement) -> bool { return currentElement % 2; });
    printList(myList, "Filter all odd elements");
 
    // myList.begin(); begin iterator
    // myList.end();   end iterator

    // myList.cbegin(); constang begin iterator
    // myList.cend();   constant end iterator

    // Мога да създавам списъци така
    std::list<int> second{1, 2, 3, 4, 5};
    printList(second, "Create second list with initializer list");
    
    // Премества елементи от един лист в друг
    myList.splice(myList.begin(), second);
    printList(myList, "First list after splice");
    printList(second, "second list after splice");

    // Да си върнем малко елементи във втория списък
    second.assign({1, 2, 3, 4, 5});
    printList(second, "Second list after .assign({1, 2, 3, 4, 5})");

    // Можем да сортираме листа
    myList.sort();
    printList(myList, "First list after beigg sorted");

    // Можем и да го сортираме наобратно
    myList.sort([](const int& fst, const int& snd) -> bool { return fst > snd; });
    printList(myList, "First list after being sorted with >");

    LinkedListNode<int>* pointreLinkedlist = 
            new LinkedListNode<int>(1, 
            new LinkedListNode<int>(2,
            new LinkedListNode<int>(3,
            new LinkedListNode<int>(4,
            new LinkedListNode<int>(5)))));
    
    mapOnListRepresentedAsPointer(pointreLinkedlist, [](int& x) -> void {x = 2*x; });
    mapOnSTLList(second, [](int& x) -> void { x = 2*x; });

    printList(second, "Second list after mappint 2*");
    std::cout << "Pointer linked list after mappint 2* " << std::endl;
    printLinkedList(pointreLinkedlist);
    std::cout << std::endl;

    // Как да добавяме елементи на произволна позиция?

    // Итератор към началото
    std::list<int>::iterator it = myList.begin();

    // Отиваме на позицията
    for (size_t i = 0; i < 2; i++) {
        ++it;
    }

    // Добавяме
    myList.insert(it, 10000);
    // insert може да вмъква и цели рейнджове
    printList(myList, "My list after adding 10000 in third pos");
}