Domanda

Mi chiedevo, io di solito uso std :: string per il mio codice, ma quando si passa una stringa in un parametro per un confronto semplice, è meglio basta usare un letterale?

Consideriamo questa funzione:

bool Message::hasTag(string tag)
{
    for(Uint tagIndex = 0; tagIndex < m_tags.size();tagIndex++)
    {
        if(m_tags[tagIndex] == tag)
            return 0;
    }

    return 1;
}

Nonostante il fatto che la proprietà si sta facendo un confronto con è un vettore, e tutto ciò che utilizza questa funzione sarà probabilmente passare stringhe ad esso, sarebbe ancora meglio utilizzare un const char * per evitare di creare una nuova stringa che la volontà essere utilizzato come un comunque letterale di stringa?

È stato utile?

Soluzione

Se si desidera utilizzare le classi, l'approccio migliore qui è un riferimento const:

bool Message::hasTag(const string& tag);

In questo modo, la copia redudant può essere ridotto al minimo ed è chiaro che il metodo non ha intenzione di modificare l'argomento. I che un compilatore intelligente può emettere codice abbastanza buono per il caso in cui questo viene chiamato con un valore letterale stringa.

Il passaggio di un puntatore a carattere richiede di utilizzare strcmp() per confrontare, dal momento che se si avvia il confronto puntatori direttamente utilizzando ==, ci saranno ... problemi.

Altri suggerimenti

Risposta breve:. Dipende

Risposta lunga: std::string è molto utile perché fornisce un sacco di funzioni di utilità per archi (alla ricerca di stringhe, stringhe estrazione, concatenazione di stringhe, ecc). Gestisce anche la memoria per voi, così la proprietà della stringa non può essere confusa.

Nel tuo caso, non è necessario neanche. Hai solo bisogno di sapere se uno qualsiasi degli oggetti in m_tags corrisponde alla stringa di dato. Quindi, per il vostro caso, scrivendo la funzione utilizzando un const char *s è perfettamente sufficiente.

Tuttavia, come nota piede: quasi sempre voglia di preferire std::string oltre (const) char * quando si parla di valori di ritorno . Questo perché stringhe C non hanno la semantica di proprietà a tutti, quindi una funzione che restituisce un bisogno const char * per essere documentato con molta attenzione, spiegando che possiede la punta alla memoria (chiamante o callee) e, nel caso in cui il chiamato ottiene, come per liberarlo ( delete[], delete, free, qualcos'altro).

penso che sarebbe sufficiente per passare un riferimento piuttosto che il valore di string. Voglio dire:

bool Message::hasTag(const string& tag)

Questo sarebbe copiare solo il riferimento al valore string originale. Che deve essere creato somwhere in ogni caso, ma al di fuori della funzione. Questa funzione non sarebbe copiare il suo parametro di sorta.

Dato m_tags è un vettore di stringhe comunque (suppongo), il parametro const string& sarebbe un'idea migliore.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top