Контейнеры STL: carte. partie 7

Noter cet article




carte класс c ++, контейнеры STL, carte pour les débutantsNous avons examiné un exemple simple d'utilisation carte<>, mais l'utilisation d'un tel récipient est déjà beaucoup plus compliqué conteneur de séquence. récipient carte<> (table, afficher):

  • Il contient des paires ordonnées <clé,sens>, où la clé et la valeur peuvent appartenir à des types arbitraires. Pour le type de clé doit être soit un prédéterminé, ou défini par l'utilisateur opération de comparaison;

  • Les éléments ayant une valeur clé doivent être unique;

  • Tentative d'ajout (méthode insérer()) de déposer une nouvelle paire avec une extrémité de la valeur clé existante échec;

  • Le fonctionnement de l'ajout d'une nouvelle paire dans les déclarations de table paire type <iterator, bool>, dans lequel le deuxième composant (booléen seconde) des points à la réussite de l'opération. Si elle vrai, la première composante de la valeur de retour (premier) iterator donne un élément ajouté. S'il faux, то возвращается итератор существующего элемента с тем же ключом;

  • Операции индексации таблицы ( [ ] ou à() ) требуют в качестве ключа любое значение типа, определённого для ключа;

  • Операция индексации à(), при задании ключа-параметра, отсутствующего в составе элементов таблицы, вызывает exception;

  • devant, операция индексации [ ], при задании ключа-параметра, отсутствующего в составе элементов таблицы, исключение не вызывает. (наоборот, даже если индексация запрошена только по чтению, добавляет к контейнеру новый элемент с требуемым значением ключа, но с нулевым полем значения);

Эти определения могут показаться замысловатыми, но всё разъяснит последующий пример.

Прежде представления примера, nous devons nous préparer des fichiers de données de test pour travailler avec des conteneurs associatifs. Le travail est une donnée de caractère volumineux démontre la puissance de l'utilisation des tables de la STL. Comme nous préparons les fichiers de données de texte, contenant de langue anglaise des textes originaux de plusieurs poèmes de Lewis Carroll.

textes Pas un peu plus compliqués à utiliser et russes, mais dans ce cas, vous devez travailler avec classes wstring et des transformations localisées, что только увеличит громоздкость примеров без увеличения их содержательности.

Вам предоставлено несколько текстов разной длины для обстоятельного тестирования кодов этой и последующих частей изложения (файлы показаны с подсчётом числа строк их текстов). Здесь, par exemple, Humpty-Dumpty.txt — это текст из части VI Humpty-Dumpty «Алиса в зазеркалье».

30 Frère et soeur 11 Chose impossible à réparer 34 Jabberwock

А Jabberwock.txt — это текст из части VI Humpty-Dumpty «Алиса в зазеркалье» — известное в русскоязычном варианте стихотворение (в исполнении В.С.Высоцкого): О бойся Бармаглота, сын! Он так свиреп и дик

В нашем оригинале (авторском, англоязычном, для отладкифайл Jabberwock.txt) этот текст выглядит так:

Jabberwock Twas brillig, and the slithy toves
Did gyre and gimble in the wabe:
All mimsy were the borogoves,
And the mome raths outgrabe.

«Beware the Jabberwock, my son!
The jaws that bite, the claws that catch!
Beware the Jubjub bird, and shun
The frumious Bandersnatch!» …

Текст, безусловно, синтаксически сложный, что делает его прекрасным материалом для отладки приложений. Вам предоставляется отменный материал для дальнейших самостоятельных экспериментов!

Итак … наше приложение будет подсчитывать число вхождений каждой из литер алфавита в предлагаемый текст, en utilisant carte<>:

récipient carte<> — не самый лучший вариант для поставленных целей: при нахождении новой литеры в тексте мы попытаемся добавить её в качестве ключа таблицы, но если эта литера уже присутствует в таблице, то попытка завершится неудачей. Dans ce cas,, после неудачи, мы, по индексу ключа, просто инкрементируем число его вхождений. И вот что мы поучаем:

carte класс c ++, контейнеры STL, carte pour les débutants
Brother_And_Sister.txt
carte класс c ++, контейнеры STL, carte pour les débutants
Humpty-Dumpty.txt
carte класс c ++, контейнеры STL, carte pour les débutants
Jabberwock.txt

Обратите внимание как увеличился размер таблицы после того, как в ней был индексированием [ ] осуществлён поиск (по чтению!) отсутствующих ключей (‘q’, ‘z’, ‘x’).

Возникает вопрос: почему вы видим в качестве Taille() такие значения как 44, 47, 50, 52, если мы наблюдаем только раскладку по повторяемости 26 символов от ‘aдо ‘z’? Ответ прост: потому что в текст могут входить символы пробела, знаков препинания, заглавных литер, которых мы не наблюдаем в выдаче теста.

Если воспользоваться такой новой возможностью стандарта C++11, как списки инициализации, создание и инициализация таблицы может выглядеть гораздо проще:

naturellement, всё это станет компилироваться только при указании опций компилятора для использования стандарта C++11:carte класс c ++, контейнеры STL, carte pour les débutants

Из сказанного уже должно быть понятно, что в качестве ключа поиска в таблице может использоваться любой тип, при обязательном условии, что для него либо определена естественная операция сравнения (int, flotte, chaîne, ...), либо мы сами определим такую пользовательскую функцию, которая будет использоваться для сравнений. Несколько способов сделать это показаны ниже:

Здесь мы, сменив функцию сравнения ключей, изменили порядок сортировки элементов при размещении их в таблице. (Во 2-м варианте используется функциональный объект, foncteur, работе с которыми будет посвящена отдельная часть нашего рассмотрения.)

carte класс c ++, контейнеры STL, carte pour les débutants

Bulletin de nouvelles leçons sur la programmation:

huile

Sur huile

une expérience pratique sur le développement de logiciels 40 ans. société de logiciels internationale Global Teacher Logic. IBM Developer Works auteur permanent des publications. éditeur scientifique de l'ordinateur littérature maison d'édition "Symbole-Plus", Saint-Pétersbourg.

8 réflexions sur "Контейнеры STL: carte. partie 7

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

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

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

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

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

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

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

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

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

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

Laisser un commentaire

Placez le code dans les balises: <pre class="lang:c ++ décodage:true ">VOTRE CODE</pré>