Как вставлять и перебирать элементы на такую ​​карту. C ++ - PullRequest
0 голосов
/ 27 мая 2020

Сам пробовал. Но я не смог этого сделать. Итак, пожалуйста, помогите.

unordered_map<string, pair<string , vector<int>>> umap;

Или, точнее, как мы можем сделать пару из одной строки и одного вектора, которые можно использовать в карте.

Ответы [ 2 ]

1 голос
/ 27 мая 2020

Ну, вы можете использовать функцию insert и вставлять их как пару (или точно вложенные пары). Например, оформить заказ на эту программу:

#include <iostream>
#include <vector>
#include <string>
#include <unordered_map>
using namespace std;

int main()
{
    unordered_map<string, pair<string , vector<int>>> umap;
    //Insert like this
    umap.insert(make_pair("first", make_pair("data1",vector<int>(3, 0))));
    umap.insert(make_pair("second", make_pair("data2",vector<int>(3, 1))));

    //or like this
    string s = "new", t= "method";
    vector <int> v = {1, 2, 3};
    umap.insert(make_pair(s, make_pair(t, v)));

    //This will print all elements of umap
    for(auto p : umap)
    {
        cout << p.first << " -> " << p.second.first << " , VECTOR : " ;
        for(auto x : p.second.second)
            cout << x << ',';
        cout << endl; 
    }
    cout << endl;

    //Let's see how to change vector already inside map
    auto itr = umap.begin();

    cout << "BEFORE : ";
    for(auto x : (itr->second).second)
    {
        cout << x << ',';
    }
    cout << endl;

    //We will push 42 here 
    (itr->second).second.push_back(42);

    cout << "AFTER : ";
    for(auto x : (itr->second).second)
    {
        cout << x << ',';
    }
    cout << endl;
}

Результат:

new -> method , VECTOR : 1,2,3,
second -> data2 , VECTOR : 1,1,1,
first -> data1 , VECTOR : 0,0,0,

BEFORE : 1,2,3,
AFTER : 1,2,3,42,

Надеюсь, это поможет.

0 голосов
/ 27 мая 2020

Это во многом зависит от сложности того, что вы создаете. Например, если у вас есть некоторые константы в вашем векторе, вы можете сделать их на месте:

umap.emplace("s", std::make_pair("s2", std::vector<int>{1, 2, 3, 4}));

Однако более вероятно, что вы будете создавать внутренние компоненты сложным образом. В этом случае вам будет проще сделать это как отдельные конструкции.

std::vector<int> values;
values.push_back(1);
auto my_value = std::make_pair("s2", std::move(values));
umap.emplace("s2", std::move(my_value));

Использование перемещения для перемещения данных обеспечивает минимальное копирование.

Наконец, для перебора элементов обычно используется range-based for loops:

for (const auto& [key, value]: umap) {
    std::cout << key << ": ";
    const auto& [name, values] = value;
    std::cout << name << " {";
    for (auto val : values) {
        std::cout << val << " ";
    }
    std::cout << "}\n";
}

Здесь вы можете проверить живой пример.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...