Catalogo subtask 2

Buongiorno,
sto svolgendo l’esercizio catalogo (CMSocial - a social coding app).
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:

#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;
}

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.

Grazie!!

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.

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?

Per risolvere il problema, potrebbe essere utile leggere qualcosa su due strutture dati della standard library: map e unordered_map.

Puoi leggere di più al riguardo ad esempio qui, nel capitolo “4.4 - Map structures” :slight_smile:

Ho risolto usando le map.
Grazie!

1 Mi Piace