Reputation: 21
I have this code that babbles a parameter from ifstream but I want it to take from vector instead:
void WriteBucket(std::ifstream &input_file, uint64_t bucket_size, size_t bucket_number) {
std::vector<double> numbers;
for (size_t i = 0; i < bucket_size && input_file; ++i) {
double current_number;
input_file >> current_number;
if (input_file) {
numbers.push_back(current_number);
}
}
sort(numbers.begin(), numbers.end());
std::ofstream output_file("intermediate_output_" + std::to_string(bucket_number));
for (double number: numbers) {
output_file << number << std::endl;
}
}
I've tried to make it take from vector and type T but the result doesn't work in the end: Is it possible to convert the reading from "ifstream" to "vector" in a better way?
template<typename T>
static void WriteBucket(vector<T> &data, uint64_t bucket_size, size_t bucket_number) {
std::vector<T> numbers;
// for (auto i = 0; i < bucket_size && !data.empty(); ++i) {
for (size_t i = 0; i < bucket_size; ++i) {
T current_number;
current_number = data[i];
if (!data.empty()) {
numbers.push_back(current_number);
}
}
sort(numbers.begin(), numbers.end());
std::ofstream zwischen_ausgabe("intermediate_output_" + std::to_string(bucket_number));
for (auto i = 0; i < numbers.size() - 1; ++i) {
zwischen_ausgabe << numbers[i] << std::endl;
}
}
Upvotes: 0
Views: 132
Reputation: 10102
Yes, you can replace the declaration of numbers
and the first for
loop with:
std::vector<T> numbers = data;
if ( bucket_size < data.size() )
numbers.resize( bucket_size );
Or
std::vector<T> numbers( data.begin(), data.begin() + std::min( data.size(), bucket_size ) );
Upvotes: 1