C ++ Чтение из типа данных текстового файла в виде структуры и хранения данных в векторах списков

0

У меня есть большие данные в текстовом файле в форме:

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;
}
  • 0
    Я бы использовал std::vector<std::unordered_map<int, float>> для этого, если порядок элементов каждой строки не является обязательным. Если требуется сортировка, я бы использовал std::vector<std::map<int, float>> . Если требуется точный исходный порядок, используйте std::vector<std::vector<MyData>>> или аналогичную конструкцию. Первые два поддерживают int как индекс, что имеет свои преимущества.
Теги:

1 ответ

3
Лучший ответ

Конечно, есть лучшие способы сделать это, но для того, чтобы показать вам, как использовать список или читать в одном, а затем поместить его в вектор.

#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";
        }
    }
}
  • 1
    Спасибо, когда вы сказали "Есть лучшие способы сделать это", вы имеете в виду более эффективный? если да, можете ли вы сказать, что лучше, так как у меня очень большой файл, и перед обработкой я хочу сохранить файл данных в формате (сохранить каждую строку внутри контейнера, например, первую строку в списке, вторую строку во втором список и тд)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню