make_pair для вектора <вектор <структура >>

0

У меня есть файл в таком формате:

id1   its_vlaue1   id2   its_vlaue2   id3   its_vlaue3 
id4   its_vlaue4   id5   its_vlaue5
id6   its_vlaue6   id7   its_vlaue7   id8   its_vlaue8 

где id - целое число, а его_vlaue - float, например:

100 0.1 2 0.6 9 0.03
4 0.6 3 0.1
.
.
until 300k line

Я прочитал этот файл как:

struct dataf
{
    int id;
    float value;
};
vector<vector<dataf>> mydata;  
dataf DF; 

void main()
{

    ifstream inFile;
    inFile.open("MyData.txt");
    if (inFile.fail())
        cout << "\n The file has been not found, please try again \n ";
    else
    {
        string line;
        cout << "\n File found!\n Reading the file data! \n\n";

        // Read the file until EOF

        while (!inFile.eof())
        {           
            getline(inFile, line); 
            std::stringstream Sline(line); 

            while (Sline >> DF.id>> DF.value)
            {               
                vector<dataf>  temp;
                temp.push_back(DF);
                mydata.push_back(temp); 
            }

        }

    }
    inFile.close();

    PairS();

    cout << " \nPress any key to continue\n";
    cin.ignore();
    cin.get();

    return;
}

Функция PairS() make_pair такая, что:

(id1,id2), (id1,id3), (id2,id3)
(id4,id5)
(id6,id7), (id6,id8), (id7,id8)

но, я не мог понять это

void PairS()
    {
        vector<dataf>::iterator i;
        vector<dataf>::iterator j;
           std::map<std::pair< int, int>, float> Pairf;

        for (int k = 0; k != ((mydata.size()) - 1); ++k)
        {

        for (i = mydata[k].begin(); i != mydata[k].end(); ++i)
        {
            int a = (*i).Item;

            for (j = mydata[k + 1].begin(); j != mydata[k+1].end(); ++j)
            {

                int b =(*j).Item;
                auto itt = Pairf.find(std::make_pair(b, a));
                ++Pairf[(itt != Pairf.end()) ? std::make_pair(b, a) : std::make_pair(a, b)];

            }

        }
        }

        cout << "\n\n The TotalSupp Count for every Pair of Items :\n\n";
        for (const auto& p : Pairf)
        {
            std::cout << "(" << p.first.first << " " << p.first.second << ") = "
                << p.second << '\n';
        }

        cout << "\n";

}

Кроме того, я не уверен, выбрал ли я подходящий метод для хранения моих данных в векторе.

Теги:
vector

1 ответ

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

Для первой части (просто чтение данных из файла) я бы, вероятно, сделал что-то вроде этого:

struct dataf
{
    int id;
    float value;

    friend std::istream &operator>>(std::istream &is, dataf &d) { 
        return is >> d.id >> d.value;
    }
};

// ...

std::ifstream in("yourfile.dat");

// read data from file to vector
std::vector<dataf> data{std::istream_iterator<dataf>(in),
                        std::istream_iterator<dataf>()};

По крайней мере, если я правильно читаю ваши PairS, вам, похоже, нужны только уникальные предметы. Если вы хотите (или, по крайней мере, не возражаете) сортировать данные в процессе, вы можете легко удалить дубликаты следующим образом:

std::sort(data.begin(), data.end());
data.erase(std::unique(data.begin(), data.end()), data.end());

Если вам нужно сохранить первоначальный заказ, вы можете сделать что-то вроде этого:

std::unordered_set unique;
std::vector<dataf> data;

std::copy_if(std::istream_iterator<dataf>(in),
             std::istream_iterator<dataf>,
             std::back_inserter(data),
             [&](dataf const &d) { return unique.insert(d).second; });

Основная идея здесь заключается в том, что по мере чтения каждого элемента он пытается вставить этот элемент в unordered_set. Скопируем if на вектор iff, который преуспевает, что указывает на то, что он не был замечен ранее.

  • 0
    Большое спасибо. Первая часть работает, но у меня есть вопрос: код, что, когда вы читаете данные из файла, в виду все данные? а () означает до конца файла?
  • 0
    вторая часть дала мне ошибки, поэтому я не проверял ее даже после вставки (#include <string> #include <vector> #include <unordered_set> #include <алгоритм>)
Показать ещё 1 комментарий

Ещё вопросы

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