Софтуерно Инженерство
Loading...
+ Нов въпрос
kostadink2001 avatar kostadink2001 2 Точки

Задача 7-ма - Miners, въпрос относно извеждането

Здравейте, имам следния въпрос към последната задача от последното домашно.Работил съм с map за да запазвам имената и съответно стойностите на видовете ресурси, но срещам сериозни затруднения при извеждането на данните, както са в примерите, а имено по ред на input-а.Та, моля за насоки как да сортирам map по реда на input-а и това всъщност въобще възможно ли е или трябва да използвам някаква друга структура от данни.По - долу прилагам кода, който съм писал по задачата.Благодаря предварително! :)

#include <iostream>
#include <map>

using namespace std;

int main(){
    map<string, int> resources;
    string currResource;
    int currNum;
    while(cin >> currResource){
        if(currResource == "stop")break;
        cin >> currNum;
        if(resources.find(currResource) != resources.end() && currResource != "stop"){
            resources[currResource] += currNum;
        }else if(resources.find(currResource) == resources.end() && currResource != "stop"){
            resources[currResource] = currNum;
        }

    }

    for(auto i = resources.begin();i != resources.end();i++){
        cout << i->first << " -> " << i->second<<endl;
    }
    return 0;
}

Тагове:
0
C++ Fundamentals 16/12/2017 01:46:00
fantom4e avatar fantom4e 24 Точки

Пробвай с unordered_map, би трябвало да стане.

0
kostadink2001 avatar kostadink2001 2 Точки

Не се получава, да, сменя реда на изходните данни, но пак не съвпадат с изхода в условието на задачата.

0
fantom4e avatar fantom4e 24 Точки

Пробвай с vector<> и в него да запазваш  pair<key,value>, по този начин ще можеш да ги принтираш на конзолата в реда в който си ги добавил.

0
georgi.stef.georgiev avatar georgi.stef.georgiev 559 Точки

Здравей,

В такава ситуация една структура данни не ти стига - трябват ти две. Едната ще ти пази mapping-а (както имаш ти), а още една ще ти пази реда на ключовете, като ще добавяш в нея само когато за пръв път добавяш нещо в map-а (защото иначе ще имаш повторения). Накрая вместо да обхождаш map-а, обхождаш тази, която ти пази реда - примерно вектор - и питаш map-а за стойността на ключа, до който си стигнал във вектора.

С две думи, когато една структура данни не ти дава всичко, което то трябва, ползваш за помощ още една/две/три/..., за да постигнеш това, което ти трябва.

Като цяло не е добра идея да се фокусирате върху една и съща структура данни за цяла задача - учили сме вече доста (даже сме учили всичките най-важни) и е хубаво да мислите как да ги комбинирате ако се наложи. Think outside of the box (map :D).

Поздрави,

Жоро

1
Todir avatar Todir 3 Точки

Аз лично не видях никъде в условието на задачата, че изхода трябва да е подреден по какъвто и да е начин освен име -> стойност.

0
Jovanna avatar Jovanna 78 Точки

Пиши си библиотеките.

Както Жоро е обяснил, създаваш един вектор, който ти пази реда на въвеждане на минералите.

После правиш връзка между двете структури (вектора и мапа), при извеждането.

Дописах кода ти, където се затрудняваш.

Успех!

 

#include <iostream>
#include <map>
#include<vector>
#include<string>

using namespace std;

int main() {
    map<string, int> resources;
    vector<string> resourcesOrderedByInput;
    string currResource;
    int currNum;
    cin >> currResource;
    while (true) {
        
        if (currResource == "stop")break;
        auto  it = find(resourcesOrderedByInput.begin(), resourcesOrderedByInput.end(), currResource);
        if (it != resourcesOrderedByInput.end())
        {
            
        }            
        else
        {
            resourcesOrderedByInput.push_back(currResource); //векторът ти пази реда на въвеждане
        }
            cin >> currNum;
        if (resources.find(currResource) != resources.end() && currResource != "stop") {
            resources[currResource] += currNum;
        }
        else if (resources.find(currResource) == resources.end() && currResource != "stop") {
            resources[currResource] = currNum;
        }
    }
     for (int i = 0; i <resourcesOrderedByInput.size(); i++)
     {
         auto iter = resources.find(resourcesOrderedByInput[i]);
         cout << resourcesOrderedByInput[i] << " -> " << iter->second << endl;
     }

    for (auto i = resources.begin(); i != resources.end(); i++) {
        
    }
    return 0;
}

0
19/12/2017 22:16:19