Map - ассоциативный контейнер типа "Ключ-Значение", Контейнер подобен Массиву и Вектору, но есть ряд отличий. Ключом может быть что угодно, один ключ может встречаться только один раз, ключи должны быть одного типа. При добавлении нового элемента, контейнер будет отсортирован по алфавиту автоматически.

In [1]:
#include <iostream>
#include <map>

using namespace std;
In [2]:
void PrintMap(const std::map<int, std::string>& m)
{
    for (auto it : m)
    {
        cout << it.first << " " << it.second << endl;
    }
}
In [3]:
void PrintMap(const std::map<std::string, int>& m)
{
    for (auto it : m)
    {
        cout << it.first << " " << it.second << endl;
    }
}
In [4]:
std::map<std::string, int> BuildReversedMap(const map<int, string>& m)
{
map<string, int> result;
for (auto item : m)
{
result[item.second] = item. first;
}
return result;
}
In [5]:
map<int, string> events;
    events[1950] = "Bjarne Stroustrup's birth";
    events[1941] = "Dennis Ritchie's birth";
    events[1970] = "UNIX epoch start";
    /*Распечатаем контейнер*/
    PrintMap(events);
    cout << "-------" <<endl;
    cout << events[1970] << endl;
    cout << endl;
    /*поменяем местами ключ и значение и распечатаем*/
    PrintMap(BuildReversedMap(events));
1941 Dennis Ritchie's birth
1950 Bjarne Stroustrup's birth
1970 UNIX epoch start
-------
UNIX epoch start

Bjarne Stroustrup's birth 1950
Dennis Ritchie's birth 1941
UNIX epoch start 1970
In [6]:
map <string, int> m = {{ "one", 1}, {"two", 2}, {"three", 3}};
    PrintMap(m); /* отсортирует по алфавиту */
    m.erase("three");
    cout << "-------" <<endl;
    /*counters["a"];*/ /* обращение к несуществующему ключу, раскомментить*/  
    PrintMap(m);
one 1
three 3
two 2
-------
one 1
two 2
In [7]:
vector<string> words = {"one", "two", "one"};
map<string, int> counters;
for (const string& word : words)
{
    if(counters.count(word)==0)
        {
            counters[word]=1;
        }else
        {
        ++counters[word];
        }
    }
PrintMap(counters);
one 2
two 1
In [8]:
vector<string> words2 = {"one", "two", "three"};
    map<char, vector<string>> grouped_words;
    for (const string& word : words2)
    {
        grouped_words[word[0]].push_back(word);	
    }
    for (const auto& item : grouped_words)
    {
        cout<<item.first<<endl;
    for (const string& word : item.second)
        {
            cout<<word<<" ";
        }
        cout << endl;
    }
o
one 
t
two three 

Vector(Продолжение)

In [9]:
#include <vector>

Вывод Вектора

In [10]:
void PrintVector(const vector<string>& v)
{
    for (string s : v) 
    {
        cout << s << endl;
    }
}

Способы ввода вектора

In [ ]:
int n1;

    cin >> n1;
    vector<string> v1(n1);
    for (string& s: v1)
    {
        cin >> s;
        
        cout<< "Current size = " << v1.size()<<endl;
    }
    PrintVector(v1);
In [ ]:
int n2;
    cin >> n2;
    // создаем пустой вектор и пушим
    vector<string> v2;
    int i=0;
    while (i<n2)
    {
        string s2;
        cin >> s2;
        v2.push_back(s2);
        
        cout<< "Current size = " << v2.size()<<endl;
        ++i;
    }

    PrintVector(v2);
In [ ]:
void PrintVector(const vector<int>& v)
{
    int k = 0;
    for (auto s : v) 
    {
        cout << k << ":"<< s << endl;
        ++k;
    }
}
In [ ]:
int j;
    cin >> j;
    vector<int> days={31, 28, 31, 30, 31};
    if(true) // год високосный, привязка по индексу(ключу)
    {
        /*обратимся ко 2му элементу, увеличим на 1*/
        days[j]++;
    }

    PrintVector(days);

Еще дополнительные операции над вектором.

In [ ]:
// очистка вектора
//is_holiday.clear();
//is_holiday.resize(0);
//is_holiday.assign(0);
//изменение размера вектора
//is_holiday.resize(N); // оставляет в векторе N первых элементов
//is_holiday.assign(N);
In [ ]:
#include<set>
In [ ]:
void PrintSet(const set<string>& s)
{
    cout<<"Size = " << s.size() << endl;
    for ( auto x : s)
    {
        cout << x << endl;
    }
}
In [ ]:
std::set<std::string> famous_persons;
famous_persons.insert("Stroustrup");
//famous_persons.insert("Stroustrup");
famous_persons.insert("BinPoisk");
famous_persons.insert("Sirius");
PrintSet(famous_persons);
famous_persons.erase("Sirius");
PrintSet(famous_persons);
In [ ]:
std::set<std::string> months = {"Jan","March", "Feb", "March"};
PrintSet(months);
In [1]:
std::set<std::string> months2 = {"Jan","March", "Feb", "March"};
std::set<std::string> months3 = {"Feb", "March","Jan"};
cout << (months2 == months3) << endl;
cout << months2.count("March");
input_line_7:2:22: error: expected '(' for function-style cast or type construction
 std::set<std::string> months2 = {"Jan","March", "Feb", "March"};
          ~~~~~~~~~~~^
input_line_7:2:7: error: no member named 'set' in namespace 'std'
 std::set<std::string> months2 = {"Jan","March", "Feb", "March"};
 ~~~~~^
input_line_7:2:24: error: use of undeclared identifier 'months2'
 std::set<std::string> months2 = {"Jan","March", "Feb", "March"};
                       ^
input_line_7:3:21: error: expected '(' for function-style cast or type construction
std::set<std::string> months3 = {"Feb", "March","Jan"};
         ~~~~~~~~~~~^
input_line_7:3:6: error: no member named 'set' in namespace 'std'
std::set<std::string> months3 = {"Feb", "March","Jan"};
~~~~~^
input_line_7:3:23: error: use of undeclared identifier 'months3'
std::set<std::string> months3 = {"Feb", "March","Jan"};
                      ^
input_line_7:4:1: error: use of undeclared identifier 'cout'
cout << (months2 == months3) << endl;
^
input_line_7:4:10: error: use of undeclared identifier 'months2'
cout << (months2 == months3) << endl;
         ^
input_line_7:4:21: error: use of undeclared identifier 'months3'
cout << (months2 == months3) << endl;
                    ^
input_line_7:4:33: error: use of undeclared identifier 'endl'; did you mean 'std::endl'?
cout << (months2 == months3) << endl;
                                ^~~~
                                std::endl
/opt/conda/bin/../lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/../../../../x86_64-conda_cos6-linux-gnu/include/c++/7.3.0/ostream:590:5: note: 'std::endl' declared here
    endl(basic_ostream<_CharT, _Traits>& __os)
    ^
input_line_7:5:1: error: use of undeclared identifier 'cout'
cout << months2.count("March");
^
input_line_7:5:9: error: use of undeclared identifier 'months2'
cout << months2.count("March");
        ^
Interpreter Error: 
In [ ]:
vector<string> myVect={"a", "b", "a"};
std::set<std::string> mySet(begin(myVect), end(myVect));
PrintSet(mySet);

Операции над строками, STRING.

Идея в следующем:

если первая строка не больше остальных, то она и является минимальной; то же самое для второй; иначе минимальной является третья.

In [ ]:
#include <string>
In [ ]:
string a, b, c;
  cin >> a >> b >> c;
  
  if (a <= b && a <= c) {
    cout << a;
  } else if (b <= a && b <= c) {
    cout << b;
  } else {
    cout << c;
  }
In [ ]:

In [ ]: