C++ (STL). Вектор векторов

STL в C++ крайне полезна. Об этом слышали очень многие. Но STL часто запрещают использовать при обучении, заставляя решать задачи без него. Отчасти это правильно, но это имеет и плохую сторону: STL может прийтись изучать самостоятельно. Самостоятельное обучение рано или поздно сводится к тому, что нужна чья-то помощь, т. е. перестает быть полноценно самостоятельным.
Изучаемая нами STL очень часто начинается с понимания векторов. С вектором более или мене ясно, но что делать, если потребовался двумерный вектор или многомерный? Вариантов несколько. Очень вероятно, что этот вектор векторов не то, что нужно, и есть более удобное решение. Но, тем не менее, для умений такое построение вектора векторов не помешает.

  • Задача (C++, STL): построить вектор векторов, в котором внешний вектор хранит строки с числами, а внутренние вектора хранят числа этих строк.
Уж простите за кривую постановку задачи, если что-то не так. Смысл её в том, что должен быть вектор, который хранит в себе строки. Сами по себе строки являются набором чисел, причём в каждой строке может быть разное количество этих чисел. А внутри вектора для каждой строки хранится вектор чисел, в который входят только те числа, которые есть в строке. Простыми словами: есть много строк и каждая такая строка хранит в себе набор чисел. Набор этих чисел хранит в себе все свои числа. В общем, извращенная и непонятно где нужная задача.
Решение этой задачи вобрало в себя несколько элементарных приемов, которые мне приходилось выискивать на разных сайтах.
Это нужно для хорошего восприятия материала:

  • Знать понятие вектора и уметь добавлять элементы в вектор.
  • Уметь обходить вектор итераторами.
  • Знать основы циклов.
Вроде бы это все знания, которые я использовал для решения.
Для собственного удобства я буду считывать строки из файла. Надеюсь, что это не будет проблемой.

distance — это функция для опознания номер индекса по итератору. Вовнутрь подается начало вектора и итератор. Пробежка от начала к указанному итератору даёт номер индекса.
at — это обращение к индексу вектора.
В принципе, вы можете попробовать сделать обход без итераторов, но подозреваю, что это у некоторых вызовет затруднения. Проход итераторами выглядит не комильфо, страшно, но зато точно выполняет нужное без лишней обработки.
Неудобочитаемость связана прежде всего с типом переменной it:

vector<string>::iterator
vector::iterator it

Названия типов можно сократить с помощью typedef. Начиная с C++11 c помощью ключевого слова auto.
Обращаю внимание, что при вложенном цикле вектор векторов я у себя в коде не использую как вектор векторов, а использую как обычный одномерный вектор.
Вывод у меня, конечно, не самый наглядный, но это мелочи. Вы можете сделать удобный себе.

Пример содержимого файла:

1 4 80 25.6 56
3.6 67
23 6 
Здесь у меня может быть не видно, но обязательно, чтоб после последнего числа был как минимум один разделяющий символ.
Надеюсь, эта публикация оказалась кому-то полезной.
Покажу пример попроще, в стиле заполнения вектора векторов наподобие заполнения массивов в Паскале. До С++11 не существовало списка инициализации, поэтому я привожу такой пример, который годится для устаревающих компиляторов.

Один комментарий на «“C++ (STL). Вектор векторов”»

  1. Могу привести пример, где такая задача приведенная более чем полезна. Есть делать граф и хранить его списком смежности, то там именно такой вектор со строками и числами в них очень нужен

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Поиск

 
     

Случайная книга в электронном формате

https://www.litres.ru/elena-benken/php-mysql-xml-programmirovanie-dlya-interneta/?lfrom=15589587
Яндекс.Метрика