#include <iostream>
#include <list>
#include <iterator>
#include <algorithm> // Dla for_each.
#include <set>
#include <string>
#include <map>
#include <deque>
#include <functional> // Dla obiektu funkcyjnego greater.
void out_int(int number);
template <class type> class runtime_cmp {
public:
enum cmp_mode { normal, reverse };
// Konstruktor dla kryterium sortowania.
runtime_cmp(cmp_mode mode_constructor = normal) : mode(mode_constructor) { }
// Porównanie elementów.
bool operator()(const type &element_one, const type &element_two) const {
return ((mode == normal) ? (element_one < element_two) : (element_two < element_one));
}
// Porównanie kryteriów sortowania.
bool operator==(const runtime_cmp &element) {
return (mode == element.mode);
}
private:
cmp_mode mode;
};
int main() {
// Kontenery sekwencyjne.
// Wektory.
// Kolejki o dwóch końcach.
std::deque<std::string> string_queue;
string_queue.assign(3, "String"); // Wstaw 3 kopie podanego łańcucha.
string_queue.push_back("Ostatni string"); // Dołącz na końcu podany element.
string_queue.push_front("Pierwszy string"); // Wstaw na początek.
std::copy(string_queue.begin(), string_queue.end(), std::ostream_iterator<std::string>(std::cout, "\n")); // Wypisz elementy w oddzielnych wierszach.
string_queue.pop_front(); // Usuń pierwszy.
string_queue.pop_back(); // Usuń ostatni element.
// Wstaw łańcuch "Other" do każdego elementu oprócz pierwszego.
for (unsigned iterator = 1; iterator < string_queue.size(); ++iterator)
string_queue[iterator] = "Other " + string_queue[iterator];
string_queue.resize(4, "String zmiany rozmiaru"); // Zmień rozmiar o ewentualnie brakujące elementy uzupełnij podanymi.
// Listy.
std::list<int> one(5, 2); // Lista pięciu wartości 2.
std::list<int> two, four, five;
int numbers[5] = { 1, 2, 3, 4, 5 };
two.insert(two.begin(), numbers, (numbers + 5)); // Wstawia kopie elementów z zakresu od drugiego do trzeciego argument przed miejscem podanym jako trzeci argument.
int more_numbers[6] = { 6, 7, 8, 9, 10, 11 };
std::list<int> three(two);
three.insert(three.end(), more_numbers, (more_numbers + 6));
std::cout << "Lista one: ";
std::for_each(one.begin(), one.end(), out_int);
std::cout << std::endl;
std::cout << "Lista two: ";
std::for_each(two.begin(), two.end(), out_int);
std::cout << std::endl;
std::cout << "Lista three: ";
std::for_each(three.begin(), three.end(), out_int);
std::cout << std::endl;
// Wypełnij listy elementami.
for (int iterator = 0; iterator < 6; iterator++) {
four.push_back(iterator);
five.push_front(iterator);
}
three.remove(2); // Usuwa z listy wszystkie wystąpienia wartości 2.
three.splice(three.begin(), one); // Wstawia zawartość listy podanej jako drugi argument (i usuwa jej zawartość) przed pozycję podaną jako pierwszy argument.
five.splice(std::find(five.begin(), five.end(), 3), four); // Wstaw wszystkie elementy kontenera podanego jako drugi argument przed pierwszym elementem, do którego iterator zwróciła funkcja find wprowadzona jako pierwszy argument.
five.splice(five.end(), five, five.begin()); // Pozycja docelowa, lista źródłowa, pozycja źródłowa (przenieś pierwszy element na koniec).
three.unique(); // Łączy grupę takich samych elementów występujących obok siebie w jeden element.
three.sort(); // Sortuje liste od wartości najmniejszej do największej.
three.merge(two); // Scala listę podaną jako argument (i usuwa jej zawartość) z listą wywołującą.
// Kontenery asocjacyjne.
// Zbiory i wielozbiory.
std::string words[] = { "Pierwszy", "Drugi", "Trzeci" };
std::string second_words[] = { "Czwarty", "Piaty" };
std::set<std::string> word_container(words, (words + 3)); // Zbiór obiektów typu string.
std::set<std::string> second_word_container(second_words, (second_words + 2));
std::set<std::string> third_word_container;
std::ostream_iterator<std::string, char> out(std::cout, " "); // Interfejs do wyświetlania typu string na strumień cout używający typu char i separatora " ".
std::copy(word_container.begin(), word_container.end(), out); // Kopiuj z do i posortuj.
std::cout << std::endl;
std::set_union(word_container.begin(), word_container.end(), second_word_container.begin(), second_word_container.end(), out); // Wysyła sumę zbiorów do strumienia podanego jako ostatni argument, sortuje i scala takie same wyrazy.
std::set_union(word_container.begin(), word_container.end(), second_word_container.begin(), second_word_container.end(), std::insert_iterator<std::set<std::string> >(third_word_container, third_word_container.begin()));
std::cout << std::endl;
std::set_intersection(word_container.begin(), word_container.end(), second_word_container.begin(), second_word_container.end(), out); // Przecięcie dwóch zbiorów.
std::cout << std::endl;
std::set_difference(word_container.begin(), word_container.end(), second_word_container.begin(), second_word_container.end(), out); // Różnica dwóch zbiorów.
std::cout << std::endl;
third_word_container.insert("Kolejny"); // Wstawiamy kolejną wartość do zbioru.
std::copy(third_word_container.lower_bound("Drugi"), third_word_container.upper_bound("Trzeci"), out); // Wyświetlanie zakresu: funkcja lower_bound przyjmuje jako argument wartość klucza i zwraca iterator, który wskazuje na pierwszy element zbioru nie mniejszy od podanego argumentu (funkcja upper_bound intuicyjnie odpowiednio).
std::cout << std::endl;
if (third_word_container.insert("Kolejny").second)
std::cout << "Wstawiono element \"Kolejny\" do kontenera \"third_word_container\".\n";
else
std::cout << "Element \"Kolejny\" w kontenerze \"third_word_container\" juz istnieje.\n";
int delete_numbers = third_word_container.erase("Kolejny"); // Usuń wszystkie elementy o podanej wartości.
std::cout << "Usuniet " << delete_numbers << " elementow \"Kolejny\".\n";
std::set <int, std::greater<int> > int_container; // Bez powtórzeń, elementy są wartościami całkowitymi, a porządek malejący.
std::set<int, std::greater<int> >::iterator position; // Iterator dla kolekcji.
int_container.insert(4);
int_container.insert(2);
int_container.insert(1);
// Iteruj po wszystkich elementach.
for (position = int_container.begin(); position != int_container.end(); ++position)
std::cout << * position << std::endl;
std::set<int> second_int_container(int_container.begin(), int_container.end()); // Przypisz elementy do innego zbioru w porządku rosnącym.
std::set<int, runtime_cmp<int> > third_int_container;
third_int_container.insert(5);
third_int_container.insert(2);
third_int_container.insert(1);
runtime_cmp<int> reverse_order(runtime_cmp<int>::reverse); // Kryterium sortowania o odwrotnej kolejności elementów.
std::set<int, runtime_cmp<int> > fourth_int_container(reverse_order);
third_int_container = fourth_int_container; // Przypisz elementy oraz kryterium sortowania.
if (third_int_container.value_comp() == fourth_int_container.value_comp())
std::cout << "Zbiory third_int_container oraz fourth_int_container posiadaja to samo kryterium sortowania.\n";
std::multiset<int, std::greater<int> > int_multicontainer; // Powtórzenia dozwolone, elementy są wartościami całkowitymi, porządek malejący.
int_multicontainer.insert(4);
int_multicontainer.insert(1);
int_multicontainer.insert(5);
std::multiset<int, std::greater<int> >::iterator multiset_pointer = int_multicontainer.insert(4); // Wstaw ponownie wartość 4.
std::cout << "Wartosc 4 wstawiono do kontenera \"int_multicontainer\" jako element nr " << std::distance(int_multicontainer.begin(), multiset_pointer) + 1 << ".\n";
// Mapy oraz multimapy.
std::map<std::string, float> map_collection;
map_collection.insert(std::map<std::string, float>::value_type("Jan", 22.3));
map_collection.insert(std::pair<std::string, float>("Bartlomiej", 26)); // Wykorzystanie konwersji niejawnej.
map_collection.insert(std::pair<const std::string, float>("Tomek", 26)); // Brak wykorzystania konwersji niejawnej.
if (map_collection.insert(std::make_pair("Michal", 0)).second)
std::cout << "Udalo sie wstawic pare Michal-0 do mapy.\n";
else
std::cout << "Nie udalo sie wstawic pary Michal-0 do mapy.\n";
for (auto map_iterator = map_collection.begin(); map_iterator != map_collection.end(); ++map_iterator)
std::cout << "Klucz: " << map_iterator->first << ", wartosc: " << map_iterator->second << std::endl;
map_collection.erase("Tomek"); // Usuń wszystkie elementy o podanym kluczu.
auto map_iterator = map_collection.find("Jan");
// Poniższe dwie instrukcje sprawiają, że podany klucz zmieni swoją nazwę.
map_collection["Jan"] = map_collection["Janek"];
map_collection.erase("Janek");
if (map_iterator != map_collection.end())
map_collection.erase(map_iterator); // Usuń pierwszy element o podanym kluczu.
map_collection["Bartek"] = map_collection["Bartlomiej"]; // Wstaw nowy element o wartości starego elementu.
map_collection["Bonifacy"] = 0;
for (auto map_iterator = map_collection.begin(); map_iterator != map_collection.end(); ++map_iterator)
map_iterator->second *= 2; // Podwajamy wartość każdego klucza.
typedef std::pair<const int, std::string> pair;
typedef std::multimap<int, std::string> map_code;
map_code codes;
codes.insert(pair(41, "Bytom"));
codes.insert(pair(81, "Bytom"));
codes.insert(pair(81, "Sopot"));
codes.insert(std::make_pair(33, "Krakow"));
std::cout << "Liczba miast o kodzie 81: " << codes.count(81) << std::endl;
std::cout << "Kod regioniu i miasto:\n";
for (auto pointer = codes.begin(); pointer != codes.end(); ++pointer)
std::cout << (* pointer).first << ", " << (* pointer).second << std::endl;
std::pair<map_code::iterator, map_code::iterator> range = codes.equal_range(81);
std::cout << "Miasta o kodzie 81:\n";
for (auto pointer = range.first; pointer != range.second; ++pointer)
std::cout << (* pointer).second << std::endl;
std::cout << "Wszystkie wartosci dla klucza 81:\n";
for (auto iterator = codes.begin(); iterator != codes.end(); ++iterator) {
if (iterator->first == 81)
std::cout << iterator->second << std::endl;
}
}
void out_int(int number) {
std::cout << number << " ";
}
#include <list>
#include <iterator>
#include <algorithm> // Dla for_each.
#include <set>
#include <string>
#include <map>
#include <deque>
#include <functional> // Dla obiektu funkcyjnego greater.
void out_int(int number);
template <class type> class runtime_cmp {
public:
enum cmp_mode { normal, reverse };
// Konstruktor dla kryterium sortowania.
runtime_cmp(cmp_mode mode_constructor = normal) : mode(mode_constructor) { }
// Porównanie elementów.
bool operator()(const type &element_one, const type &element_two) const {
return ((mode == normal) ? (element_one < element_two) : (element_two < element_one));
}
// Porównanie kryteriów sortowania.
bool operator==(const runtime_cmp &element) {
return (mode == element.mode);
}
private:
cmp_mode mode;
};
int main() {
// Kontenery sekwencyjne.
// Wektory.
// Kolejki o dwóch końcach.
std::deque<std::string> string_queue;
string_queue.assign(3, "String"); // Wstaw 3 kopie podanego łańcucha.
string_queue.push_back("Ostatni string"); // Dołącz na końcu podany element.
string_queue.push_front("Pierwszy string"); // Wstaw na początek.
std::copy(string_queue.begin(), string_queue.end(), std::ostream_iterator<std::string>(std::cout, "\n")); // Wypisz elementy w oddzielnych wierszach.
string_queue.pop_front(); // Usuń pierwszy.
string_queue.pop_back(); // Usuń ostatni element.
// Wstaw łańcuch "Other" do każdego elementu oprócz pierwszego.
for (unsigned iterator = 1; iterator < string_queue.size(); ++iterator)
string_queue[iterator] = "Other " + string_queue[iterator];
string_queue.resize(4, "String zmiany rozmiaru"); // Zmień rozmiar o ewentualnie brakujące elementy uzupełnij podanymi.
// Listy.
std::list<int> one(5, 2); // Lista pięciu wartości 2.
std::list<int> two, four, five;
int numbers[5] = { 1, 2, 3, 4, 5 };
two.insert(two.begin(), numbers, (numbers + 5)); // Wstawia kopie elementów z zakresu od drugiego do trzeciego argument przed miejscem podanym jako trzeci argument.
int more_numbers[6] = { 6, 7, 8, 9, 10, 11 };
std::list<int> three(two);
three.insert(three.end(), more_numbers, (more_numbers + 6));
std::cout << "Lista one: ";
std::for_each(one.begin(), one.end(), out_int);
std::cout << std::endl;
std::cout << "Lista two: ";
std::for_each(two.begin(), two.end(), out_int);
std::cout << std::endl;
std::cout << "Lista three: ";
std::for_each(three.begin(), three.end(), out_int);
std::cout << std::endl;
// Wypełnij listy elementami.
for (int iterator = 0; iterator < 6; iterator++) {
four.push_back(iterator);
five.push_front(iterator);
}
three.remove(2); // Usuwa z listy wszystkie wystąpienia wartości 2.
three.splice(three.begin(), one); // Wstawia zawartość listy podanej jako drugi argument (i usuwa jej zawartość) przed pozycję podaną jako pierwszy argument.
five.splice(std::find(five.begin(), five.end(), 3), four); // Wstaw wszystkie elementy kontenera podanego jako drugi argument przed pierwszym elementem, do którego iterator zwróciła funkcja find wprowadzona jako pierwszy argument.
five.splice(five.end(), five, five.begin()); // Pozycja docelowa, lista źródłowa, pozycja źródłowa (przenieś pierwszy element na koniec).
three.unique(); // Łączy grupę takich samych elementów występujących obok siebie w jeden element.
three.sort(); // Sortuje liste od wartości najmniejszej do największej.
three.merge(two); // Scala listę podaną jako argument (i usuwa jej zawartość) z listą wywołującą.
// Kontenery asocjacyjne.
// Zbiory i wielozbiory.
std::string words[] = { "Pierwszy", "Drugi", "Trzeci" };
std::string second_words[] = { "Czwarty", "Piaty" };
std::set<std::string> word_container(words, (words + 3)); // Zbiór obiektów typu string.
std::set<std::string> second_word_container(second_words, (second_words + 2));
std::set<std::string> third_word_container;
std::ostream_iterator<std::string, char> out(std::cout, " "); // Interfejs do wyświetlania typu string na strumień cout używający typu char i separatora " ".
std::copy(word_container.begin(), word_container.end(), out); // Kopiuj z do i posortuj.
std::cout << std::endl;
std::set_union(word_container.begin(), word_container.end(), second_word_container.begin(), second_word_container.end(), out); // Wysyła sumę zbiorów do strumienia podanego jako ostatni argument, sortuje i scala takie same wyrazy.
std::set_union(word_container.begin(), word_container.end(), second_word_container.begin(), second_word_container.end(), std::insert_iterator<std::set<std::string> >(third_word_container, third_word_container.begin()));
std::cout << std::endl;
std::set_intersection(word_container.begin(), word_container.end(), second_word_container.begin(), second_word_container.end(), out); // Przecięcie dwóch zbiorów.
std::cout << std::endl;
std::set_difference(word_container.begin(), word_container.end(), second_word_container.begin(), second_word_container.end(), out); // Różnica dwóch zbiorów.
std::cout << std::endl;
third_word_container.insert("Kolejny"); // Wstawiamy kolejną wartość do zbioru.
std::copy(third_word_container.lower_bound("Drugi"), third_word_container.upper_bound("Trzeci"), out); // Wyświetlanie zakresu: funkcja lower_bound przyjmuje jako argument wartość klucza i zwraca iterator, który wskazuje na pierwszy element zbioru nie mniejszy od podanego argumentu (funkcja upper_bound intuicyjnie odpowiednio).
std::cout << std::endl;
if (third_word_container.insert("Kolejny").second)
std::cout << "Wstawiono element \"Kolejny\" do kontenera \"third_word_container\".\n";
else
std::cout << "Element \"Kolejny\" w kontenerze \"third_word_container\" juz istnieje.\n";
int delete_numbers = third_word_container.erase("Kolejny"); // Usuń wszystkie elementy o podanej wartości.
std::cout << "Usuniet " << delete_numbers << " elementow \"Kolejny\".\n";
std::set <int, std::greater<int> > int_container; // Bez powtórzeń, elementy są wartościami całkowitymi, a porządek malejący.
std::set<int, std::greater<int> >::iterator position; // Iterator dla kolekcji.
int_container.insert(4);
int_container.insert(2);
int_container.insert(1);
// Iteruj po wszystkich elementach.
for (position = int_container.begin(); position != int_container.end(); ++position)
std::cout << * position << std::endl;
std::set<int> second_int_container(int_container.begin(), int_container.end()); // Przypisz elementy do innego zbioru w porządku rosnącym.
std::set<int, runtime_cmp<int> > third_int_container;
third_int_container.insert(5);
third_int_container.insert(2);
third_int_container.insert(1);
runtime_cmp<int> reverse_order(runtime_cmp<int>::reverse); // Kryterium sortowania o odwrotnej kolejności elementów.
std::set<int, runtime_cmp<int> > fourth_int_container(reverse_order);
third_int_container = fourth_int_container; // Przypisz elementy oraz kryterium sortowania.
if (third_int_container.value_comp() == fourth_int_container.value_comp())
std::cout << "Zbiory third_int_container oraz fourth_int_container posiadaja to samo kryterium sortowania.\n";
std::multiset<int, std::greater<int> > int_multicontainer; // Powtórzenia dozwolone, elementy są wartościami całkowitymi, porządek malejący.
int_multicontainer.insert(4);
int_multicontainer.insert(1);
int_multicontainer.insert(5);
std::multiset<int, std::greater<int> >::iterator multiset_pointer = int_multicontainer.insert(4); // Wstaw ponownie wartość 4.
std::cout << "Wartosc 4 wstawiono do kontenera \"int_multicontainer\" jako element nr " << std::distance(int_multicontainer.begin(), multiset_pointer) + 1 << ".\n";
// Mapy oraz multimapy.
std::map<std::string, float> map_collection;
map_collection.insert(std::map<std::string, float>::value_type("Jan", 22.3));
map_collection.insert(std::pair<std::string, float>("Bartlomiej", 26)); // Wykorzystanie konwersji niejawnej.
map_collection.insert(std::pair<const std::string, float>("Tomek", 26)); // Brak wykorzystania konwersji niejawnej.
if (map_collection.insert(std::make_pair("Michal", 0)).second)
std::cout << "Udalo sie wstawic pare Michal-0 do mapy.\n";
else
std::cout << "Nie udalo sie wstawic pary Michal-0 do mapy.\n";
for (auto map_iterator = map_collection.begin(); map_iterator != map_collection.end(); ++map_iterator)
std::cout << "Klucz: " << map_iterator->first << ", wartosc: " << map_iterator->second << std::endl;
map_collection.erase("Tomek"); // Usuń wszystkie elementy o podanym kluczu.
auto map_iterator = map_collection.find("Jan");
// Poniższe dwie instrukcje sprawiają, że podany klucz zmieni swoją nazwę.
map_collection["Jan"] = map_collection["Janek"];
map_collection.erase("Janek");
if (map_iterator != map_collection.end())
map_collection.erase(map_iterator); // Usuń pierwszy element o podanym kluczu.
map_collection["Bartek"] = map_collection["Bartlomiej"]; // Wstaw nowy element o wartości starego elementu.
map_collection["Bonifacy"] = 0;
for (auto map_iterator = map_collection.begin(); map_iterator != map_collection.end(); ++map_iterator)
map_iterator->second *= 2; // Podwajamy wartość każdego klucza.
typedef std::pair<const int, std::string> pair;
typedef std::multimap<int, std::string> map_code;
map_code codes;
codes.insert(pair(41, "Bytom"));
codes.insert(pair(81, "Bytom"));
codes.insert(pair(81, "Sopot"));
codes.insert(std::make_pair(33, "Krakow"));
std::cout << "Liczba miast o kodzie 81: " << codes.count(81) << std::endl;
std::cout << "Kod regioniu i miasto:\n";
for (auto pointer = codes.begin(); pointer != codes.end(); ++pointer)
std::cout << (* pointer).first << ", " << (* pointer).second << std::endl;
std::pair<map_code::iterator, map_code::iterator> range = codes.equal_range(81);
std::cout << "Miasta o kodzie 81:\n";
for (auto pointer = range.first; pointer != range.second; ++pointer)
std::cout << (* pointer).second << std::endl;
std::cout << "Wszystkie wartosci dla klucza 81:\n";
for (auto iterator = codes.begin(); iterator != codes.end(); ++iterator) {
if (iterator->first == 81)
std::cout << iterator->second << std::endl;
}
}
void out_int(int number) {
std::cout << number << " ";
}
Ź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.