# Catalogo subtask 2

**URL:** <https://forum.olinfo.it/t/catalogo-subtask-2/7247>\
**Category:** Aiuto\
**Created:** [8 Aprile 2022, 3:51pm UTC](https://forum.olinfo.it/t/catalogo-subtask-2/7247 "2022-04-08T15:51:05Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![fmaglia](https://forum.olinfo.it/user_avatar/forum.olinfo.it/fmaglia/32/1075_2.png) [@fmaglia](https://forum.olinfo.it/u/fmaglia)\
**Post date:** [8 Aprile 2022, 3:51pm UTC](https://forum.olinfo.it/t/catalogo-subtask-2/7247/1 "2022-04-08T15:51:05Z")

</div>

Buongiorno,  
sto svolgendo l’esercizio catalogo ([CMSocial - a social coding app](https://training.olinfo.it/#/task/catalogo/statement)).  
Dovrebbe essere abbastanza semplice. Uso un vector di pair \<int,int\>.  
Svolgo correttamente i casi d’esempio, ma nel subtask 2 tutti i testcase, tranne il testcase 002, mi restituiscono _output not correct_. Non riesco proprio a capire quale sia l’errore e quali siano gli input che riportano valore sbagliato. Qualcuno riesce ad aiutarmi?  
Codice:

```auto
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <assert.h>
#include <vector>
using namespace std;

static std::vector <pair<int,int>> libreria;

void aggiungi(long long int id) {
    bool insert = false;
    for (int i=0; i<libreria.size(); i++) {
        if (libreria[i].first == id){
            libreria[i].second++;
            insert = true;
            break;
        }
    }
    if (!insert){
        libreria.push_back(pair<int,int>(id,1));
    }
}

void togli(long long int id) {
    for (int i=0; i<libreria.size(); i++) {
        if (libreria[i].first == id){
            libreria[i].second--;
            if (libreria[i].second == 0)
                libreria.erase(libreria.begin()+i);
            break;
        }
    }
}

int conta(long long int id) {
    for (int i=0; i<libreria.size(); i++) {
        if (libreria[i].first == id){
            return libreria[i].second;
        }
    }
    return 0;
}

```

---

<div class="post-metadata">

**Author:** ![frakkiobello](https://forum.olinfo.it/user_avatar/forum.olinfo.it/frakkiobello/32/2768_2.png) [@frakkiobello](https://forum.olinfo.it/u/frakkiobello)\
**Post date:** [8 Aprile 2022, 4:38pm UTC](https://forum.olinfo.it/t/catalogo-subtask-2/7247/2 "2022-04-08T16:38:24Z")

</div>

Gli identificativi dei libri sono dei `long long` quindi anche il `.first` di ogni elemento del vettore `libreria` deve essere un `long long`. Anche quando inserisci la coppia `{1,1}` devi specificare il giusto tipo.

---

<div class="post-metadata">

**Author:** ![fmaglia](https://forum.olinfo.it/user_avatar/forum.olinfo.it/fmaglia/32/1075_2.png) [@fmaglia](https://forum.olinfo.it/u/fmaglia)\
**Post date:** [8 Aprile 2022, 4:43pm UTC](https://forum.olinfo.it/t/catalogo-subtask-2/7247/3 "2022-04-08T16:43:32Z")

</div>

Grazie!!

---

<div class="post-metadata">

**Author:** ![fmaglia](https://forum.olinfo.it/user_avatar/forum.olinfo.it/fmaglia/32/1075_2.png) [@fmaglia](https://forum.olinfo.it/u/fmaglia)\
**Post date:** [9 Aprile 2022, 10:51am UTC](https://forum.olinfo.it/t/catalogo-subtask-2/7247/4 "2022-04-09T10:51:43Z")

</div>

Sono riuscito a far funzionare il codice e ottengo 40/100.  
Per i restanti 60 punti del terzo subtask devo ottimizzare il mio codice.  
Ho pensato di utilizzare la funzione find( ) o find\_if( ) della standard library.  
Ho però qualche problema ad implementare la relativa lambda function.

```auto
static std::vector <pair<long long,long long>> libreria;
void togli(long long id) {

    vector<pair<long long,long long>>::iterator it = std::find_if( libreria.begin(), libreria.end(),
    [](const std::pair<std::long long, long long>& element){ return element.first == id;} );

    if (it != libreria.end()){
        it->second--;
    }
}

```

Voglio che la funzione find\_if( ) mi trovi l’iteratore che soddisfa la condizione tale per cui il primo element del pair sia uguale all’id passato come parametro nella funzione togli.  
Qualcuno riesce ad aiutarmi a sistemarla?

---

<div class="post-metadata">

**Author:** ![filippos](https://forum.olinfo.it/user_avatar/forum.olinfo.it/filippos/32/103_2.png) [@filippos](https://forum.olinfo.it/u/filippos)\
**Post date:** [9 Aprile 2022, 11:17am UTC](https://forum.olinfo.it/t/catalogo-subtask-2/7247/5 "2022-04-09T11:17:25Z")

</div>

Per risolvere il problema, potrebbe essere utile leggere qualcosa su due strutture dati della standard library: [map](https://en.cppreference.com/w/cpp/container/map) e [unordered\_map](https://en.cppreference.com/w/cpp/container/unordered_map).

Puoi leggere di più al riguardo ad esempio [qui](https://cses.fi/book/book.pdf), nel capitolo “4.4 - Map structures” 🙂

---

<div class="post-metadata">

**Author:** ![fmaglia](https://forum.olinfo.it/user_avatar/forum.olinfo.it/fmaglia/32/1075_2.png) [@fmaglia](https://forum.olinfo.it/u/fmaglia)\
**Post date:** [10 Aprile 2022, 10:50am UTC](https://forum.olinfo.it/t/catalogo-subtask-2/7247/6 "2022-04-10T10:50:42Z")

</div>

Ho risolto usando le map.  
Grazie!
