// MathJax

Data Structure

: Array, Vector, Queue, Stack, Heap, List, Map, Iterator, Generator, Tree, Graph

#include <iostream>
using namespace std;

int main(){
    int arr[] = {100, 200, 300, 400, 500};

    int i_start = 0;
    int i_end = static_cast<int>(sizeof(arr)/sizeof(arr[0]));
    for(int i=i_start; i<i_end; i++){
        cout << arr[i] << ' ';
    } cout << endl;

    int* ptr_start = &arr[0];
    int* ptr_end = &arr[0] + static_cast<ptrdiff_t>(sizeof(arr)/sizeof(arr[0]));
    for(int* ptr=ptr_start; ptr<ptr_end; ptr++){
        cout << *ptr << ' ';} cout << endl;
}
#include <iostream>
#include <array>
#include <algorithm>
using namespace std;

int main(){
    array<int, 5> sarr = {100, 200, 300, 400, 500};
    cout << *sarr.begin() << endl;
    cout << *sarr.end() << endl;

    int key = 0;
    for_each(sarr.begin(), sarr.end(), [&key](int value){
            cout << to_string(key++) + ", " + to_string(value) << endl;
            });

    for(auto value: sarr){
        cout << value << endl;
    }

    for(int key=0; key<sarr.size(); key++){
        cout << sarr[key] << endl;
    }

    for(int* it = sarr.begin(); it < sarr.end(); it++){
        cout << *it << endl;
    }

}
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main(){
    vector<int> darr = {100, 200, 300, 400, 500};
    cout << *darr.begin() << endl;
    cout << *darr.end() << endl;

    int key = 0;
    for_each(darr.begin(), darr.end(), [&key](int value){
            cout << to_string(key++) + ", " + to_string(value) << endl;
            });

    for(auto value: darr){
        cout << value << endl;
    }

    for(int key=0; key<darr.size(); key++){
        cout << darr[key] << endl;
    }

    for(vector<int>::iterator it = darr.begin(); it != darr.end(); it++){
        cout << *it << endl;
    }

}

 

 

Initializer List, Pair, Tuple and Variant, Any

Initializer List

#include <iostream>
using namespace std;

int main() {
    initializer_list<int> ilist = {1,2,3,4,5};
    for (const auto& val1 : ilist) {
        cout << val1 << endl;
    }

    return 0;
}

 

Pair

#include <iostream>
#include <utility>
using namespace std;

int main() {
    pair<int, std::string> pair_type(1, "text");

    cout << pair_type.first << endl;
    cout << pair_type.second << endl;

    return 0;
}
#include <iostream>
#include <vector>
#include <utility>
using namespace std;

int main() {
    vector<pair<int, int>> container = {{1, 2}, {3, 4}, {5, 6}};

    for (auto& [val1, val2] : container) {
        cout << val1 << ", " << val2 << endl;
    }

    return 0;
}

Tuple

#include <iostream>
#include <tuple>
using namespace std;

int main() {
    tuple<int, double, string> tuple_type(1, 3.14, "text");

    cout << get<0>(tuple_type) << endl;
    cout << get<1>(tuple_type) << endl;
    cout << get<2>(tuple_type) << endl;

    return 0;
}
#include <iostream>
#include <tuple>
#include <vector>
using namespace std;

int main() {
    vector<tuple<int, double, string>> container = {
        {1, 2.5, "apple"},
        {2, 3.6, "banana"},
        {3, 4.7, "cherry"}
    };

    for (const auto& [val1, val2, val3] : container) {
        cout << val1 << ", " << val2 << ", " << val3 << endl;
    }

    return 0;
}

 

Variant

#include <iostream>
#include <variant>
#include <string>
using namespace std;

int main(){
    variant<int, double, string> a = 1;
    variant<int, double, string> b = 3.14;
    variant<int, double, string> c = "text";

    cout << get<int>(a) << endl;
    cout << get<double>(b) << endl;
    cout << get<string>(c) << endl;
}
#include <iostream>
#include <variant>
#include <string>
using namespace std;

int main(){
    variant<int, double, string> a = 1;
    visit([](auto&& value) {
            cout << value << endl;
        }, a);

    variant<int, double, string> b = 3.14;
    visit([](auto&& value) {
            cout << value << endl;
        }, b);

    variant<int, double, string> c = "text";
    visit([](auto&& value) {
            cout << value << endl;
        }, c);
}
#include <iostream>
#include <variant>
#include <vector>
#include <string>
using namespace std;

int main() {
    vector<variant<int, double, string>> container = {3.14, 0, "text"};
    
    for (const auto& item : container) {
        visit([](auto&& value) {
            cout << value << endl;
        }, item);
    }
}

 

Any

#include <iostream>
#include <any>
#include <string>
using namespace std;

int main() {
    any a;
    a = 1;
    a = 3.14;
    a = "text";

    try{
        cout << any_cast<int>(a) << endl;
        cout << any_cast<double>(a) << endl;
        cout << any_cast<string>(a) << endl;
    }
    catch (const bad_any_cast& e){
        cout << e.what() << endl;
    }
}
#include <iostream>
#include <any>
#include <vector>
#include <string>
using namespace std;

int main() {
    vector<any> container = {3.14, 0, "text"};

    for (const auto& item : container) {
        if (item.type() == typeid(int)) {
            cout << any_cast<int>(item) << '\n';
        } else if (item.type() == typeid(double)) {
            cout << any_cast<double>(item) << '\n';
        } else if (item.type() == typeid(string)) {
            cout << any_cast<string>(item) << '\n';
        }
    }

}

 

 

Static and Dynamic Array

[Array]: Static Array; Stack Memory

1D Array

#include <iostream>
#include <string>
#include <utility>
#include <tuple>
#include <variant>
#include <any>
#include <array>
using namespace std;

int main() {
    array<pair<int, int>, 3> container1 = {
        pair<int, int>{1, 2},
        pair<int, int>{3, 4},
        pair<int, int>{5, 6}
    };
    array<tuple<int, double, string>, 3> container2 = {
        tuple<int, double, string>{1, 2.5, "apple"},
        tuple<int, double, string>{2, 3.6, "banana"},
        tuple<int, double, string>{3, 4.7, "cherry"}
    };
    array<variant<int, double, string>, 3> container3 = {
        variant<int, double, string>(3.14),
        variant<int, double, string>(0),
        variant<int, double, string>("text")
    };
    array<any, 3> container4 = {
        any(3.14),
        any(0),
        any("text")
    };

    return 0;
}

 

2D Array

//

 

[Vector]: Dynamic Array; Heap Memory

1D Vector

#include <iostream>
#include <string>
#include <utility>
#include <tuple>
#include <variant>
#include <any>
#include <vector>
using namespace std;

int main() {
    vector<pair<int, int>> container1 = {
        {1, 2},
        {3, 4},
        {5, 6}
    };
    vector<tuple<int, double, string>> container2 = {
        {1, 2.5, "apple"},
        {2, 3.6, "banana"},
        {3, 4.7, "cherry"}
    };
    vector<variant<int, double, string>> container3 = {
        3.14,
        0,
        "text"
    };
    vector<any> container4 = {
        3.14,
        0,
        "text"
    };
    
    return 0;
}

 

2D Vector

//

 

Generator and Iterator

For Loop

//

 

For Each Lambda Loop

//

 

 

Enumerator

#include <iostream>
#include <vector>
#include <utility> // for std::pair

// Enumerator class
template<typename Container>
class Enumerator {
public:
    // Constructor
    Enumerator(Container& container) : container_(container), index_(0) {}

    // Begin iterator
    class Iterator {
    public:
        Iterator(typename Container::iterator it, size_t index) : it_(it), index_(index) {}

        // Dereference operator
        std::pair<size_t, typename Container::value_type> operator*() const {
            return std::make_pair(index_, *it_);
        }

        // Increment operator
        Iterator& operator++() {
            ++it_;
            ++index_;
            return *this;
        }

        // Equality operator
        bool operator!=(const Iterator& other) const {
            return it_ != other.it_;
        }

    private:
        typename Container::iterator it_;
        size_t index_;
    };

    Iterator begin() {
        return Iterator(container_.begin(), 0);
    }

    Iterator end() {
        return Iterator(container_.end(), container_.size());
    }

private:
    Container& container_;
    size_t index_;
};

// Helper function to create an Enumerator
template<typename Container>
Enumerator<Container> enumerate(Container& container) {
    return Enumerator<Container>(container);
}

int main() {
    std::vector<std::string> vec = {"apple", "banana", "cherry"};

    for (auto [index, value] : enumerate(vec)) {
        std::cout << "Index: " << index << ", Value: " << value << std::endl;
    }

    return 0;
}

 

Iterator

#include <iostream>
using namespace std;

template <typename T>
class Iterator {
    T* ptr;

    public:
        Iterator(T* p=nullptr) : ptr(p) {}

        T& operator*() const {
            return *ptr;
        }

        T* operator->() const {
            return ptr;
        }

        Iterator& operator++() {
            ++ptr;
            return *this;
        }

        Iterator operator++(int) {
            Iterator temp = *this;
            ++(*this);
            return temp;
        }

        Iterator& operator--() {
            --ptr;
            return *this;
        }

        Iterator operator--(int) {
            Iterator temp = *this;
            --(*this);
            return temp;
        }
        
        ptrdiff_t operator-(const Iterator& other) const {
            return ptr - other.ptr;
        }

        Iterator operator+(ptrdiff_t n) const {
            return Iterator(ptr + n);
        }

        Iterator operator-(ptrdiff_t n) const {
            return Iterator(ptr - n);
        }

        Iterator& operator+=(ptrdiff_t n) {
            ptr += n;
            return *this;
        }

        Iterator& operator-=(ptrdiff_t n) {
            ptr -= n;
            return *this;
        }

        bool operator==(const Iterator& other) const {
            return ptr == other.ptr;
        }

        bool operator!=(const Iterator& other) const {
            return ptr != other.ptr;
        }

        bool operator<(const Iterator& other) const {
            return ptr < other.ptr;
        }

        bool operator<=(const Iterator& other) const {
            return ptr <= other.ptr;
        }

        bool operator>(const Iterator& other) const {
            return ptr > other.ptr;
        }

        bool operator>=(const Iterator& other) const {
            return ptr >= other.ptr;
        }
};        

int main() {
    int arr[] = {1, 2, 3, 4, 5};
    Iterator<int> begin(arr);
    Iterator<int> end(arr + 5);

    for (Iterator<int> it = begin; it != end; ++it) {
        std::cout << *it << " ";
    }

    return 0;
}

 

Generator

//

 

 

 

STL Container

[Queue]

//

 

[Stack]

//

 

[Heap]

//

 

[List]

#include <iostream>
#include <list>
#include <iterator>
#include <variant>
using namespace std;

int main() {
    list<int> container{1,2,3,4,5};
    for (const auto& i: container) {
        cout << i << endl;
    };

    return 0;
}
#include <iostream>
#include <list>
#include <iterator>
#include <variant>

using namespace std;

int main(){
    list<int> a;
    for(int i = 0; i < 10; i++) {a.push_back(i);};
    for(const auto& i: a) {
        cout << i << endl;
    }

    cout << *a.begin() << endl;
    cout << *a.end() << endl;

    return 0;
}
#include <iostream>
#include <list>
#include <iterator>
#include <variant>
using namespace std;

int main() {
    list<int> container{0,1,2,3,4,5,6,7,8,9};
    list<int>::iterator it = container.begin();

    cout << container.size() << endl;
    cout << container.empty() << endl;

    advance(it, 4); // *it : 4
    it = container.erase(it); // *it : 5
    it = container.erase(it); // *it : 6
    it = container.erase(it); // *it : 7
    container.insert(it, 4);  // *it : 7
    container.insert(it, 5);  // *it : 7
    container.insert(it, 6);  // *it : 7

    for (const auto& i: container) {
        cout << i << endl;
    };

    container.clear();
    return 0;
}
#include <iostream>
#include <list>
#include <iterator>
#include <variant>

using namespace std;

int main(){
        list<int> a;

        for(int i = 0; i < 10; i++) {
                a.push_back(i);
        }

        cout << *a.begin() << endl;
        cout << *a.end() << endl;

        return 0;
}
#include <iostream>
#include <list>
#include <iterator>
#include <variant>
using namespace std;

int main() {
    list<int> container{1,2,3,4,5};
    for (const auto& i: container) {
        cout << i << endl;
    };

    list<int> new_container;
    for (const auto& i: container) {
        new_container.push_back(i);
        new_container.pop_back();
    };

    for (const auto& i: container) {
        new_container.push_front(i);
        new_container.pop_front();
    };

    for (const auto& i: new_container) {
        cout << i << endl;
    };

    return 0;
}

 

[Map]

#include <iostream>
#include <map>
using namespace std;

int main() {
    map<std::string, int> container;
    container["apple"] = 0;
    container["banana"] = 1;
    container["cat"] = 2;

    cout << container["apple"] << endl;
    cout << container["banana"] << endl;
    cout << container["cat"] << endl;

    return 0;
}

 

[Multimap]

//

 

[Tree]

//

 

[Graph]

//

 

 

 


Algorithm: Sort and Search

find_if

 

 

 

 

 

 


Memory: Process and Thread

cstdlib

//

 

 

 


Asynchronous Programming: Corutine

 

 

 

 

 


Design Pattern

 

 

 

 

 

 

 

 

 


Reference

 

 

'quantitative analysis > programming' 카테고리의 다른 글

CPP Build System and Library  (0) 2024.07.06
Basic CPP Programming  (1) 2024.07.06
Bash Programming  (0) 2024.02.26
Computational Environment Configuration  (0) 2023.08.14

+ Recent posts