Контейнеры STL: carta geografica. parte 7




mappa класс C ++, контейнеры STL, map per i principiantiAbbiamo considerato un semplice esempio di come usare la mappa<>, ma l'uso di un tale contenitore è già molto più complicato contenitore di sequenza. contenitore carta geografica<> (tavolo, display):

  • Esso contiene coppie ordinate <chiave,senso>, dove la chiave e il valore possono appartenere a tipi arbitrari. Per il tipo di chiave deve essere un predeterminato, o definite dall'utente operazione di confronto;

  • Elementi con qualsiasi valore chiave dovrebbe essere unico;

  • Il tentativo di aggiungere (metodo inserire()) a presentare una nuova coppia con un fine valore di chiave esistente fallimento;

  • L'operazione di aggiunta di una nuova coppia alle rilevazioni tabella coppia tipo <iteratore, bool>, in cui il secondo componente (booleano secondo) punta al successo dell'operazione. Se vero, il primo componente del valore di ritorno (primo) iteratore dà un elemento aggiunto. Se lui falso, ritorna iteratore elemento esistente con la stessa chiave;

  • operazioni tavola rotante ( [ ] o a() ) richiede alcun tipo di valore come chiave, determinato tasto;

  • Operazione indicizzazione a(), quando si imposta il tasto del parametro, Assenza negli elementi della tabella, cause eccezione;

  • davanti, operazione di indicizzazione [ ], quando si imposta il tasto del parametro, Assenza negli elementi della tabella, l'eccezione non causa. (al contrario, anche se l'indicizzazione ha chiesto di sola lettura, aggiunge il contenitore un nuovo elemento con il valore di chiave desiderato, ma nullo valori di campo);

Queste definizioni possono sembrare complicato, ma spiegherebbe l'esempio successivo.

Prima di presentare l'esempio, dobbiamo preparare alcuni file di dati di test per lavorare con contenitori associativi. Il lavoro è un dato carattere voluminoso dimostra il potere di utilizzare tabelle STL. Mentre ci prepariamo i file di dati di testo, contenente lingua inglese testi originali di diverse poesie di Lewis Carroll.

Non è un po 'più complicato da usare e russi testi, ma in questo caso si deve lavorare con classi wstring e le trasformazioni localizzato, aumenterà solo l'ingombro di esempi, senza un aumento della loro significatività.

Ti ho dato un paio di testi di diversa lunghezza per un test approfondito del codice e parti successive della presentazione (file vengono mostrati con conteggio del numero di righe di testo). è, per esempio, Humpty-Dumpty.txt - è il testo della parte VI Humpty Dumpty-«Alice nel paese delle meraviglie».

30 Fratello e sorella 11 Humpty Dumpty- 34 Jabberwock

A Jabberwock.txt - è il testo della parte VI Humpty Dumpty-«Alice nel paese delle meraviglie" - conosciuta nella versione in lingua russa del poema (da VS Vysotsky): A proposito di paura Barmaglota, figlio! egli Svirn e selvaggio…

Nel nostro originale (diritto d'autore, Di lingua inglese, per eseguire il debug – файл Jabberwock.txt) Questo testo appare come:

Jabberwock Twas Brillig, e le toves slithy
Ha fatto gyre e gimble nel wabe:
Tutti Mimsy erano la Borogove,
E i Raths Mome outgrabe.

«Attenzione al Jabberwock, mio figlio!
Le ganasce che mordono, gli artigli che catturano!
Attenzione l'uccello jubjub, e rifuggire
Il Frumious Bandersnatch!» …

testo, certamente, complesso sintatticamente, che lo rende un ottimo materiale per applicazioni debug. Si sono dotati di ottimi materiali per ulteriori esperimenti indipendenti!

Quindi ... la nostra applicazione calcolerà il numero di occorrenze di ciascuna delle lettere dell'alfabeto nel testo proposto, utilizzando carta geografica<>:

contenitore carta geografica<> - Non la migliore opzione per i tuoi obiettivi: quando il nuovo lettere nel testo cercheremo di aggiungerlo come una tabella chiave, ma se questa lettera è già presente nella tabella, il tentativo fallisce. In questo caso,, dopo fallimento, noi, la chiave di indice, semplicemente incrementare il numero delle sue occorrenze. Ed è quello che noi possiamo imparare:

mappa класс C ++, контейнеры STL, map per i principianti
Brother_And_Sister.txt
mappa класс C ++, контейнеры STL, map per i principianti
Humpty-Dumpty.txt
mappa класс C ++, контейнеры STL, map per i principianti
Jabberwock.txt

Si noti come aumento Dimensioni tabella dopo, come è stato indicizzazione [ ] Ricerca implementato (lettura!) chiavi mancanti (‘Q’, 'Z', 'X').

La questione si pone: Perché si vede come dimensione() valori come la 44, 47, 50, 52, Se vediamo solo il layout della ripetibilità 26 personaggi da 'un’ до 'z'? La risposta è semplice: perché i caratteri di spazio possono essere inclusi nel testo, punteggiatura, lettere maiuscole, non osserviamo nella prova di emissione.

Se si prende vantaggio di questa nuova opportunità per C ++ 11 di serie, l'elenco di inizializzazione, la creazione e l'inizializzazione della tabella possono apparire molto più facile:

naturalmente, Tutto questo sarà compilato solo se si specificano le opzioni del compilatore per l'utilizzo di C ++ standard di 11:mappa класс C ++, контейнеры STL, map per i principianti

Da quanto sopra dovrebbe essere chiaro, che qualsiasi tipo può essere utilizzata come chiave di ricerca in una tabella, fornito sempre, per lui o vi è un'operazione di confronto naturale (int, galleggiante, corda, ...), o noi stessi definiamo una funzione definita dall'utente, che sarà utilizzato per i confronti. Alcuni modi per farlo sono riportati di seguito:

qui, sostituzione funzione di confronto chiave, modificare l'ordine delle voci quando si inseriscono nella tabella. (Nella seconda forma di realizzazione, un oggetto funzionale, funtore, lavoro che sarà discussa in una parte separata della nostra recensione.)

mappa класс C ++, контейнеры STL, map per i principianti

Newsletter nuove lezioni sulla programmazione:

Контейнеры STL: carta geografica. parte 7
Vota questo articolo

olio

Di olio

esperienze pratiche circa lo sviluppo del software 40 anni. Maestro globale Logic società di software internazionale. IBM Developer funziona autore permanente di pubblicazioni. redattore scientifico del computer casa editrice letteratura "Simbolo-Plus", San Pietroburgo.

8 pensieri su "Контейнеры STL: carta geografica. parte 7

  1. Получилась интересная и понятная статья.
    А будет продолжениеудаление, замена, contains, поиск по ключу и др.?

  2. Обязательно будет.
    Это какая часть? 7-я?
    Так уже готовых есть 16.
    Ожидайте.

  3. Спасибо за невероятный труд и помощь в изучении С++, однако теперь пошли непонятки. До сих пор нормально было в течении уроков. Прежде чем что-то писать в качестве примера, нужно объяснить что это. altrimenti, если пример непонятен, то толка нет от учебы, только практика запоминается и усваивается. Ладно неупомянутый символ ^Z (ctrl-Z) удается заметить на картинке результата работы программы со стихами в консоли и хорошо, если читатель знает, что он означает конец файла для консоли, без его ввода программа не работала бы (цикл не завершился бы). Но в следующем примере пошло еще тяжелее .

    1) функторы не изучались, что это неизвестно и пример понять невозможно, потому что там написано bool operator(), а мы так не делали ни разу, после слова operator перед скобками всегда писали знак оператора (+, -, …). Хорошо, можно подумать, что наверное подразумевается тот знак, который находится в выражении после return. А в следующих строчках еще более непонятно:

    2) carta geografica< int, int, less > – это что? Было изучено что map состоит из пары ключ-значение, а less что здесь делает и что такое less вообще непонятно. По виду можно предположить что это некий шаблонный класс с параметром int. Но скорее всего он указывает порядок сортировки по значению ключа в убывании или возрастании данных в контейнере map.

    3) map mg1(great); – это непонятно. Можно догадываться в том или ином направлении, только догадки мало помогают в таких делах. mg1(great) – это конструктор с параметром функцией? Такой конструктор для map не изучался, и не только для map.

    4) carta geografica – примерно то же самое.

    Подводя итог можно сказать, что это за третий параметр появился при объявлении объекта-контейнера map внутри угловых скобок? Видно по контексту, что он задает порядок сортировки по значению ключа, но достоверной информации нет.

      1. До сих пор нормально было в течении уроков. Прежде чем что-то писать в качестве примера, нужно объяснить что это.

        1. solo “до сих порбыло только потому, что до сих пор было только цветочкизатрагивались только самые-самые элементарные понятия C++. Сейчас описываются уже достаточно продвинутые средства.

        2. Из матлингвистики, теории языков программирования известно, che qualsiasi язык программирования не может быть описан строго последовательно, и поэтому описываются они рекурсивно: используя конструкции, которые ещё не описывались ранее. questo теория.
        Если что-то вам категорически не понятнопропустите это, вы вернётесь к нему позже, при “2-м проходе”, когда оно уже станет понятным.

Lascia un Commento

L'indirizzo email non verrà pubblicato. i campi richiesti sono contrassegnati *