У меня есть большие данные в текстовом файле в форме:
1 0.933 2 0.865 3 0.919 4 0.726
2 0.854 3 0.906 4 0.726
2 0.882 5 0.853 4 0.897
.
. etc
каждое целое число следует с его значением float. Я хочу прочитать этот файл за строкой и сохранить каждую строку в списке. Я знаю, как это сделать, используя массив связанных списков, но я не мог исправить утечку памяти. Я читал, что лучше использовать STL вместо этого. Пример:
list 1= 1 0.933 2 0.865 3 0.919 4 0.726
list 2= 2 0.854 3 0.906 4 0.726
list 3= 2 0.882 5 0.853 4 0.897
.
.
Я не уверен, что (векторы списков) аналогичны (массив связанных списков). Я пробовал разные способы, но все мои попытки потерпели неудачу.
#include "stdafx.h"
#include <vector>
#include <list>
#include <iostream>
#include <map>
#include <sstream>
#include <iterator>
#include <fstream>
struct MyData{
int Item;
float Prob;
};
std::istream& operator>>(std::istream &is, MyData&d)
{
return is >> d.Item >> d.Prob;
}
int main()
{
std::ifstream in("DataF.txt");
std::string line;
int i = 0;
while (std::getline(in, line)) {
typedef std::istream_iterator<MyData> MyDataIstrIt;
std::stringstream ss(line);
std::vector< std::list< MyData> > data3{ MyDataIstrIt(ss), MyDataIstrIt() }; // here I couldn't fix the extractor definition for the vectors of lists
// another attempt
/*std::vector<MyData> data{ MyDataIstrIt(ss), MyDataIstrIt() };
std::vector< std::list< MyData> > data2;
data2.push_back(std::vector<MyData>()); // I read this is important for memory leak
data2.push_back(data);*/
// data2[i].push_back(data);
// ++i;
}
system("PAUSE");
return 0;
}
Конечно, есть лучшие способы сделать это, но для того, чтобы показать вам, как использовать список или читать в одном, а затем поместить его в вектор.
#include <vector>
#include <list>
#include <iostream>
#include <map>
#include <sstream>
#include <iterator>
#include <fstream>
struct MyData
{
int Item;
float Prob;
};
std::istream& operator>>(std::istream &is, MyData&d)
{
return is >> d.Item >> d.Prob;
}
int main()
{
std::string line;
std::vector<std::list<MyData>> data;
std::ifstream in("DataF.txt"); //don't forget to check 'if (in.is_open())'
while(std::getline(in, line))
{
std::stringstream ss(line);
std::list<MyData> inner;
MyData info;
while(ss >> info)
{
inner.push_back(info);
}
data.push_back(inner);
}
for (auto &list : data)
{
for (auto &mdata : list)
{
std::cout<<mdata.Item<<" "<<mdata.Prob<<"\n";
}
}
}
std::vector<std::unordered_map<int, float>>
для этого, если порядок элементов каждой строки не является обязательным. Если требуется сортировка, я бы использовалstd::vector<std::map<int, float>>
. Если требуется точный исходный порядок, используйтеstd::vector<std::vector<MyData>>>
или аналогичную конструкцию. Первые два поддерживаютint
как индекс, что имеет свои преимущества.