niedziela, 31 sierpnia 2014

Wektory STL w C++

#include <iostream>
#include <vector>
#include <algorithm>

bool is_lower_than_3(double number);

int main() {
    std::vector<int> numbers(5); // Wektor 5 liczb całkowitych.
    // std::vector<int> numbers(5, 1); // Wektor pięciu liczb 1.
    int elements;

    std::cout << "Ile wektor lancuchow ma miec elementow: ";

    std::cin >> elements;

    std::vector<std::string> titles(elements);

    // Przypisanie konkretnym elementom wektora danych wartości.

    for (int iterator = 0; iterator < numbers.size(); iterator++)
        numbers[iterator] = iterator; // Brak kontroli zakresu.

    try {
        numbers.at(5) = 6; // Kontrola zakresu.
    } catch (std::out_of_range & extension) {
        std::cout << "Blad kontroli zakresu: " << extension.what() << std::endl;
    }

    std::vector<int>::iterator pointer; // Deklaracja iteratora.
    // auto pointer = numbers.begin();

    pointer = numbers.begin(); // Iterator wskazuje na pierwszy element wektora.

    *pointer = 1;

    ++pointer; // Przesuwamy iterator na kolejny element.

    *pointer = 2;

    numbers.back() = 0; // Przypisz ostatniemu elementowi wartość 0.

    // Wypisanie wszystkich elementów wektora za pomocą iteratora.

    for (pointer = numbers.begin(); pointer != numbers.end(); pointer++)
        std::cout << * pointer << std::endl;

    std::vector<double> scores;

    std::cout << "Najwieksza mozliwa liczba elementor dla wektora zmiennych typu double to w tym wypadku " << scores.max_size() << " natomiast w aktualnym obszarze pamieci moze pomiescic " << scores.capacity() << " elementy.\n"; // Funkcja capacity zwróci wartość większa od zera dopiero jak w wektorze znajdą się jakieś wartości.

    std::cout << "Ile chcesz wprowadzic wartosci punktow: ";

    std::cin >> elements;

    // scores.reserve(elements); // Zarezerwuj obszar pamięci na elements elementów.

    double temporary;

    for (int iterator = 0; iterator < elements; iterator++) {
        std::cout << "Podaj wartosc: ";

        std::cin >> temporary;

        scores.push_back(temporary); // Dodaje element na koniec wektora. Z kolei funkcja pop_back usuwa ostatni element.
    }

    scores.erase(scores.begin(), (scores.begin() + 2)); // Usuwamy pierwszy i drugi element.

    std::cout << "Podaj ktora wartosc chcesz usunac z kontenera liczb calkowitych: ";

    std::cin >> elements;

    pointer = std::find(numbers.begin(), numbers.end(), elements);

    if (pointer != numbers.end())
        numbers.erase(pointer);

    std::vector<double> new_scores(scores); // Konstruktor kopiujący.

    new_scores.insert(new_scores.begin(), scores.begin(), scores.end()); // Wstawia przed pierwszy element wektora (określany jako pierwszy argument) wartości wektora określane zakresem drugiego i trzeciego argumentu.

    for_each(new_scores.begin(), new_scores.end(), is_lower_than_3); // Dla każdego elementu z zakresu podanego przez iteratory wywołujemy daną funkcję.

    // for (auto iterator : new_scores)
        // is_lower_than_3(iterator);

    std::random_shuffle(new_scores.begin(), new_scores.end()); // Zamienia kolejność elementów w sposób losowy.

    std::sort(new_scores.begin(), new_scores.end()); // Sortuje wartości w porzadku rosnącym (jeśli elementy kontenera nie są zdefiniowane przez użytkownika). Jeżeli chcemy sortować w porządku malejącym to musimy napisać funkcję, która porównuje dwa pierwsze argumenty funkcji sort, a jej nazwę podać jako trzeci argument.

    std::vector<int> next_numbers(numbers.begin(), numbers.end());

    new_scores.resize(0); // Ustawia liczbę elementów kontenera na 0.

    new_scores.clear(); // Opróżnia kontener.

    new_scores.~vector<double>(); // Niszczy wszystkie elementy i zwalnia pamięć.
}

bool is_lower_than_3(double number) {
    if (number < 3)
        return true;
    else
        return false;
}

Źródło:
- Prata S., Język C++. Szkoła programowania. Wydanie VI, Helion SA, 2012,
- Josuttis N. M., C++. Biblioteka standardowa, Helion SA, 2003.