STL Вектор векторов. Пример одной простой задачи. STL в C++ крайне полезна. Об этом слышали очень многие. Но STL часто запрещают использовать при обучении, заставляя решать задачи без него. Отчасти это правильно, но это имеет и плохую сторону. STL приходится изучать самостоятельно. Самостоятельное обучение рано или поздно приводит к тому, что кто-то что подскажет или поможет. Т.е перестает быть полноценно самостоятельным. Изучаемая нами STL очень часто начинается с векторов. С вектором более или мене ясно, но что делать, если потребовался двумерный вектор или многомерный? Вариантов несколько. Очень вероятно, что этот вектор векторов не то, что нужно, и есть более удобное для использования. Но, тем не менее, для умений такое построение вектора векторов не помешает. Задача C++ STL Построить вектор векторов, в котором внешний вектор хранит строки с числами, а внутренний вектор хранит эти числа. (уж простите за кривую постановку задачи если что-то не так). Смысл такой, что должен быть вектор, который хранит в себе строки. Сами по себе строки являются набором чисел, причем в каждой строке может быть разное количество этих чисел. А внутри вектора для каждой строки хранится вектор чисел, в который входят только те числа, которые есть в строке. Простыми словами: Есть много строк и каждая такая строка хранит в себе набор чисел. Набор этих чисел хранит в себе все свои числа. В общем, извращенная и непонятно где нужная задача. Но решение этой задачи собрало в себя несколько элементарных приемов, которые мне приходилось выискивать в разных сайтах. Что нужно знать для хорошего восприятия материала: Понятие вектора и умение добавлять в него элементы.Уметь обходить вектор итераторами Знание циклов Вроде бы это все знания, которые я использовал для решения. Для некоторого своего удобства, я буду считывать строки из файла. Надеюсь не будет проблемой C++ STL Вектор векторов. Вектор строк, содержащий числа этих строк#include <iostream>#include <fstream>#include <vector>#include <sstream> //для разбиения строки на числа//#include <iterator>using namespace std;int main(){ vector<string> v_S; //Вектор хранит целые строки vector<vector <double> > V_D; //Каждый элемент вектора, хранящий строку, хранит в себе все числа из этой строки V_D.resize(10000); //без этого ошибка. Типа делаю очень большой вектор string S; //Строка, прочитанная из файла std::stringstream ss; //Сюда впихиваем все числа из строки double x; //Сюда забираем все числа из ss int count_(0); //Номер элемента вектора, хранящего строки ifstream F("M:\test.txt"); //Читаем файл while (!F.eof()){ //Пока не достигли конца файла getline(F,S); //Читаем строку v_S.push_back(S); //Строку кладем в вектор строк ss<<S; //Строку кладем в мясорубку (для рления на числа) while (ss>>x) { //Пока в мясорубку идут данные из строки, V_D.at(count_).push_back(x); //В вектор чисел добавляем полученное число (Вектор чисел принадлежит строке №count_ из вектора строк // cout<<x<<"n"; //Это так. Для видимости } // cout<<"n"; ss.clear(); //Надо помыть мясорубку. count_++; }//Конец файла - конец цикла по файлу F.close(); //Не забываем закрывать открытый файл/*Здесь обход векторов.*/for (vector<string>::iterator it=v_S.begin();it!=v_S.end();it++) cout<<*it<<" n";cout<<"==================n";/*Вот такой обход немного затруднительно придумать без знаний. Но знать такое как раз полезно */for (vector<string>::iterator it2=v_S.begin();it2!=v_S.end();it2++){ for (vector<double>::iterator it=(V_D.at(distance(v_S.begin(),it2))).begin();it!=(V_D.at(distance(v_S.begin(),it2)).end());it++) { cout<<*it<<" "; //Получаем все числа по по порядку } }return 0;}distance – Это узнать номер индекса по итератору. Вовнутрь подается начало вектора и итератор, а пробегая от начала к указанному итератору, получается номер индекса. at – Это обращение к индексу вектора В принципе, вы можете попробовать сделать обход без итераторов, но подозреваю, что это у некоторых вызовет затруднения. Проход итераторами выглядит не комильфо, страшно, но зато точно выполняет без лишнего. Неудобочитаемость связана прежде всего с типом переменной it vector::iterator vector::iterator it Но эти типы объявленыля векторов еще в самом начале, поэтому так выходит. Можно их сократить с помощью typedef, но сути это совсем не меняет. Обращаю внимание, что при вложенном цикле, вектор векторов не использую как вектор векторов, а использую как обычный одномерный вектор. Вывод у меня не самый наглядный, но это мелочи. Пример содержимого файла 1 4 80 25.6 563.6 6723 6Обязательно, чтоб после последней цифры был как минимум 1 разделяющий символ. Надеюсь этот пример оказался кому-то полезен. Источник - http://nomerateka.ru