Запись вектора C ++ пар в текстовый файл - PullRequest
2 голосов
/ 13 июня 2019

У меня есть vector из pair с именем vec1.Какой (самый быстрый) способ записать это в текстовый файл (в Linux)?

#include <iostream>
#include <utility>   
#include <vector>
#include <fstream>
#include <iomanip> 

int main() {
    std::vector<std::pair<int, std::vector<float>>> vec1 { {1,{0.11,0.12,0.13}},
        {2,{0.14,0.15,0.16}}, {3,{0.17,0.18,0.19}} };    
} 

Я пытался что-то вроде этого:

std::ofstream fout("file.txt");
fout << std::setprecision(4);

for(auto const& x : vec1)
    fout << x << '\n';

, но я получаю ошибку:

ошибка: невозможно связать 'std :: basic_ostream ' lvalue с 'std :: basic_ostream &&'

Ответы [ 2 ]

2 голосов
/ 13 июня 2019

Нет встроенного оператора вставки для std::pair<T, U>.Вы можете сделать его самостоятельно или распечатать поля вручную:

for (auto const& x : vec1) {
    fout << x.first << ": "; 
    for (float f : x.second) fout << f << " ";
    fout << '\n';
}
0 голосов
/ 13 июня 2019

std::pair не имеет перегруженного оператора вывода, вам придется записать first и second пары отдельно, или вы можете сделать оператор вставки.
для первого решения

for(const auto& p : vec1) {
    fout << p.first << ' ' << p.second << std::endl;
}

и это делает оператор вывода и использует его, хотя это может быть излишним для этой ситуации: РЕДАКТИРОВАТЬ: Я только что заметил, что second, в вашем примере имеет тип std::vector, и, как и std::pair, у него нет перегруженного оператора вывода, поэтому вам придется сделать оператор также для std::vector. Это общий фрагмент, который предполагает, что для типов T и U уже настроен оператор вывода.

#include <vector>
#include <utility>
#include <fstream>

template <typename T, typename U>
std::ostream &operator<<(std::ostream &out, const std::pair<T, U>& p) {
    out << p.first << ' ' << p.second << std::endl;
    return out;
}

int main() {
    // ...
    for(const auto& p : vec1) {
        fout << p;
    }

    return 0;
}

...