Перейти к содержанию

C++ Stl Вектор Векторов


Рекомендуемые сообщения

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

  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.