Как записать векторные значения в файл

У меня большой вектор.

Способы, которые я использую, умножают время выполнения программы. Первый - записать все значения в строку, поскольку они вычисляются с помощью stringstreams, а затем записывают строку в файл. Другой метод - сделать длинную строку после факта и записать это в файл. Однако, оба они очень медленные.

Есть ли способ сразу записать векторные значения в текстовый файл с разрывами строк?

Ответы

Ответ 1

Используя std::ofstream, std::ostream_iterator и std::copy() - это обычный способ сделать это. Ниже приведен пример с std::string с использованием синтаксиса С++ 98 (вопрос был задан до С++ 11):

#include <fstream>
#include <iterator>
#include <string>
#include <vector>

int main()
{
    std::vector<std::string> example;
    example.push_back("this");
    example.push_back("is");
    example.push_back("a");
    example.push_back("test");

    std::ofstream output_file("./example.txt");
    std::ostream_iterator<std::string> output_iterator(output_file, "\n");
    std::copy(example.begin(), example.end(), output_iterator);
}

Ответ 2

#include <fstream>
#include <vector>
#include <string>

int main()
{
    std::vector<std::string> v{ "one", "two", "three" };
    std::ofstream outFile("my_file.txt");
    // the important part
    for (const auto &e : v) outFile << e << "\n";
}

Ответ 3

Возможно, я что-то пропустил, но что не так:

std::ofstream f("somefile.txt");
for(vector<X>::const_iterator i = v.begin(); i != v.end(); ++i) {
    f << *i << '\n';
}

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