Quale direzione dovrei considerare l'offset quando si cercano le stringhe al contrario?

2

Sto facendo una funzione di utilità indexOfReverse nel mio programma C ++, e ho preso un po 'di intoppo. L'implementazione dell'offset e di maxOffset nel mio indexOf è stata molto intuitiva per me .. Questi iniziano dall'inizio della stringa (+ offset) e vanno avanti fino alla fine della stringa (o maxOffset se specificato).

Durante l'implementazione degli offset per indexOfReverse, però, mi chiedevo quale fosse il modo più logico per farlo? L'offset dovrebbe essere dall'inizio della stringa o alla fine della stringa? C'è una norma stabilita per questo mi manca da qualche parte? Ho provato a spiegarlo alla mia papera, ma lui mi ha guardato in modo strano. Sono propenso a pensarci dall'inizio, perché la sua facilità d'uso è più preziosa per me del suo contro-intuitivo .. considerando l'offset dalla fine, mi rende più difficile pensare nella mia testa. / p>

Ho visto come è fatto in una libreria di stringhe per C ++ , PHP e Python , e ciò che sembra comune nella descrizione di ognuno è trovare l'ultima occorrenza di una stringa in cui l'offset è considerato dall'inizio, piuttosto che fare una vera ricerca inversa ... Ma io desidero vera ricerca per la stringa inversa piuttosto che per l'ultima occorrenza. C'è un modo più logico per considerare questo, però, quindi posso andare avanti?

    
posta abelito 21.07.2012 - 20:54
fonte

2 risposte

3

Dai un'occhiata a come è stato fatto nella libreria standard C ++: string::rfind . Meglio ancora, usa questa funzione invece di crearne una tua.

Prendono le correzioni dall'inizio della stringa. In questo modo è più semplice utilizzare il risultato, ad esempio substr :

string str         = "I haven't done C++ in a while.";
size_t last_in     = str.rfind("in");
string last_phrase = str.substr(last_in); // "in a while."

In realtà ci sono due decisioni da prendere per una funzione rfind :

  • L'indice dei risultati dovrebbe basarsi sull'inizio del pagliaio?

    I haven't done C++ in a while.
    0123456789
    

    o la fine di esso?

    I haven't done C++ in a while.
                         9876543210
    
  • L'indice dei risultati dovrebbe essere l'inizio del risultato trovato?

    I haven't done C++ in a while.
                       ^
    

    o la fine di esso?

    I haven't done C++ in a while.
                         ^
    

Se rispondiamo "end" a una di queste domande, dobbiamo rispondere a un'altra domanda: "end" significa l'ultimo carattere?

in
 ^

o il carattere dopo di esso?

in
  ^

Quest'ultimo è più coerente con il regime degli indici basati all'inizio.

    
risposta data 22.07.2012 - 01:53
fonte
1

Per la maggior parte degli utenti di stringhe, misurare l'offset dall'inizio della stringa indipendentemente dal metodo chiamato sarebbe più sensato.

Riconoscere che quando un utente vuole ottenere l'ultima ricorrenza di qualcosa, non implica che l'utente abbia un uso logico della "stringa invertita". Se fosse così, l'utente avrebbe potuto semplicemente fare un reverse prima e procedere con qualsiasi operazione desiderata. Piuttosto, è più probabile che l'utente sia interessato a dividere la stringa in tre o più parti:

Mr. Thomas A. Anderson
<<<|------|>>>>>>>>>>>

Vale a dire, tutto prima, la sottostringa corrispondente e tutto il resto.

Per questo motivo, è necessario passare gli offset di stringa ottenuti da un metodo in un altro metodo, tra find e rfind . Avere due definizioni complica la questione.

Un approccio più sfumato consisterebbe nel definire un enumerator di corrispondenze, a.k.a. Regex . Questo enumeratore consente di navigare qualsiasi numero di partite. Per ogni occorrenza, è possibile interrogare le posizioni del primo carattere e dell'ultimo carattere.

    
risposta data 22.07.2012 - 03:26
fonte

Leggi altre domande sui tag