2010-06-17 2 views
22

In C++, perché string::find restituisce size_type e non uno iterator?Perché string :: find restituisce size_type e non un iteratore?

Avrebbe senso perché funzioni come string::replace o string::insert prendono iteratori come input, così si potrebbe find qualche personaggio e subito passare l'iteratore restituito al replace, ecc

Inoltre, std::find restituisce un iteratore - perché è std::string::find diverso?

risposta

5

Probabilmente è più utile ottenere un numero da trovare perché è possibile utilizzare l'operatore [] o substr() per ottenere i caratteri che sono stati cercati.

Inoltre, se si vuole un iteratore, si può sempre fare begin() + pos

+3

Quindi stai dicendo che la cattiva interfaccia di 'string :: find' è buona perché interagisce bene con la cattiva interfaccia di' string :: substr'? ;) – Praxeolitic

+0

Non vorrei gironzolare con gli iteratori quando tutto ciò che voglio è ottenere le prime due lettere di una stringa – shoosh

+0

del tipo: begin() + pos – fchen

0

presumo che sia perché in generale i membri di stringa lavorare su indici piuttosto che iteratori e questo lo rende facile da usare il valore restituito. È sempre possibile utilizzare std::find se si desidera ottenere un iteratore.

+0

Volevo solo dire che 'std :: vector' funziona anche inerentemente sugli indici e non restituisce size_type quando si cerca qualcosa - ma poi mi sono ricordato che il vettore non ha find(). Ti chiedi perché 'stringa' ha ... – Frank

+1

@dehmann: ce l'ha per ragioni storiche. 'std :: string' è stato il primo (quindi' std :: basic_string') e poi è arrivato STL con i suoi iteratori. Quando si è deciso di incorporare lo STL nello standard, in realtà è stato considerato vicino alla finalizzazione. (L'incorporazione di STL ha ritardato di circa un anno.) In realtà esistevano già implementazioni di 'std :: basic_string' in uso. Quindi le modifiche sono state mantenute minime e per lo più solo aggiunte. – sbi

25

Il design della nuova classe di corde della libreria standard era già stato eseguito quando Stroustrup ha introdotto il comitato standard alla STL. Il comitato ha apprezzato l'AWL e ha iniziato a incorporarlo nello standard, adattando così gran parte di ciò che avevano già concordato (e probabilmente anche ritardando lo standard per un altro anno o due).

Tra le altre modifiche, gli iteratori sono stati aggiunti alla classe di corde già finita come un ripensamento. Puoi vedere questo osservando i vari membri della stringa prendendo/restituendo una posizione: è un mix selvaggio di indici e iteratori.

Non è sempre facile indovinare perché alcune funzioni membro hanno solo versioni che assumono indici e altre hanno anche prese da iteratore. Nel caso di std::basic_string<>::find(), tuttavia, sembra facile: poiché std::find() restituisce già un iteratore, std::basic_string<>::find() è rimasto come era.

+0

L'ultimo paragrafo è confuso. Vuoi dire, ha senso avere basic_string <> :: find() restituire size_type perché std :: find() restituisce già un iteratore e i progettisti non vogliono duplicare questo comportamento? Non avrebbe senso renderli simili, migliorando la conformità e la facilità d'uso della biblioteca? – Frank

+0

fondamentalmente, se avete bisogno di usare iterator std :: find(), se avete bisogno di usare index std :: basic_string <> :: find() –

+5

E 'string' è mal progettato comunque ... –

3

Tutte le funzioni di stringa operano su indici, alcune funzioni (come replace() e insert()) solo inoltre iteratori di supporto. Quindi il risultato di find()può essere utilizzato direttamente in queste funzioni con. Dal momento che non ci possono essere due funzioni find() che differiscono per tipo di ritorno (una restituisce un iteratore, una restituisce un indice) occorre scegliere una.