1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
//C++ Листинг #1 Вектор векторов Вектор строк, содержащих свои числа #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 << " "; //Получаем все числа по по порядку } } } |
Пример содержимого файла:
1 4 80 25.6 56 3.6 67 23 6
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
//C++ Листинг #2 Вектор векторов #include <iostream> #include <vector> #include <iterator> #include <mem.h> using namespace std; int main(){ setlocale(LC_ALL,""); vector< vector<int> > vec; vec.resize(2); for (int i=0, size=vec.size(); i<size; ++i){ vec[i].resize(7); //По аналогии с выделением памяти у двумерного масива 2*7 } vec[0][0]=0; vec[1][0]=9; vec[0][1]=1; vec[1][1]=8; vec[0][2]=2; vec[1][2]=7; vec[0][3]=3; vec[1][3]=6; vec[0][4]=0; vec[1][4]=5; vec[0][5]=1; vec[1][5]=4; vec[0][6]=2; vec[1][6]=3; //А обход можно сделать попроще чем выше показано for (vector< vector<int> >::iterator it=vec.begin(); it!=vec.end(); it++){ copy((*it).begin(),(*it).end(),ostream_iterator<int>(cout,"\t")); cout << '\n'; } } |
Могу привести пример, где такая задача приведенная более чем полезна. Есть делать граф и хранить его списком смежности, то там именно такой вектор со строками и числами в них очень нужен