istream_iterator, ostream_iterator,copy以及文件序列化

#include <iostream>
#include <fstream>
#include <algorithm>
#include <cassert>
#include <numeric>
#include <string>
using namespace std;

int main()
{
 vector<int> vec_int;
 for (int i=0; i<10; i++)
  vec_int.push_back(i);
 partial_sum(vec_int.begin(), vec_int.end(), vec_int.begin());
 vector<double> vec_double;
 for (int i=0; i<10; i++)
  vec_double.push_back(2.11);
 partial_sum(vec_double.begin(), vec_double.end(), vec_double.begin());
 vector<string> vec_str;
 for (int i=0; i<10; i++)
  vec_str.push_back("hkx");
 partial_sum(vec_str.begin(), vec_str.end(), vec_str.begin());
 //
 ostream_iterator<int> out(cout, ";");
 copy(vec_int.begin(), vec_int.end(), out);
 ostream_iterator<double> out1(cout, ";");
 copy(vec_double.begin(), vec_double.end(), out1);
 ostream_iterator<string> out2(cout, ";");
 copy(vec_str.begin(), vec_str.end(), out2);
 //

 ofstream ofs;
 ofs.open("hkx.dat");
 assert(ofs!= 0);
 ostream_iterator<int> os(ofs, ";");
 copy(vec_int.begin(), vec_int.end(), os);
 ostream_iterator<double> os1(ofs, ";");
 copy(vec_double.begin(), vec_double.end(), os1);
 ostream_iterator<string> os2(ofs, ";");
 copy(vec_str.begin(), vec_str.end(), os2);
 ofs.close(); //必须close,否则下面的ofstream中读取不到数据
 //

 ifstream ifs;
 ifs.open("hkx.dat");
 assert(ifs != NULL);
 vec_int.clear();
 vec_double.clear();
 vec_str.clear();

 copy(istream_iterator<int>(ifs), istream_iterator<int>(), back_inserter(vec_int));
 int ttm = vec_int.size();
 copy(vec_int.begin(), vec_int.end(), ostream_iterator<int>(cout, " "));

 ifs.clear();
 ifs.ignore(10, ';');
 copy(istream_iterator<double>(ifs), istream_iterator<double>(), back_inserter(vec_double));
 copy(vec_double.begin(), vec_double.end(), ostream_iterator<double>(cout, " "));

 ifs.clear();
 ifs.ignore(10, ';');
 copy(istream_iterator<string>(ifs), istream_iterator<string>(), back_inserter(vec_str));
 copy(vec_str.begin(), vec_str.end(), ostream_iterator<string>(cout, " "));

 return 0;
}

### C++ 实现重新组合最小值的清晰方法 为了找到两个数使得它们和的绝对值最小,可以通过双指针法来高效解决这个问题。这种方法利用了数组已经排序的特点,从而可以在 O(n) 时间复杂度内完成查找。 #### 双指针法原理 由于输入是一个有序整数序列字符串,因此可以直接应用双指针技术。初始化一对指针分别指向数组的第一个元素 (left) 和最后一个元素 (right),计算当前这对元素之和的绝对值,并记录下这组解;随后根据两者相加的结果调整指针位置——如果总和大于零,则右移左指针尝试减小正值部分的影响;反之则左移右指针减少负值影响,直到遍历结束为止[^2]。 下面是具体的 C++ 代码实现: ```cpp #include <iostream> #include <vector> #include <cmath> // abs() using namespace std; pair<vector<int>, int> findMinAbsSum(const vector<int>& nums){ if(nums.size() < 2) throw invalid_argument("Array must contain at least two elements"); int min_abs_sum = INT_MAX; pair<int, int> result_pair; size_t left = 0; size_t right = nums.size()-1; while(left < right){ const auto sum = nums[left] + nums[right]; if(abs(sum) < min_abs_sum){ min_abs_sum = abs(sum); result_pair.first = nums[left]; result_pair.second = nums[right]; // Early exit condition when perfect match found. if(min_abs_sum == 0) break; } if(sum > 0){ --right; }else{ ++left; } } return make_pair(vector<int>{result_pair.first, result_pair.second}, min_abs_sum); } int main(){ string input_str="-1 -3 7 5 11 15"; stringstream ss(input_str); vector<int> numbers((istream_iterator<int>(ss)), istream_iterator<int>()); try { auto [two_nums, abs_val]=findMinAbsSum(numbers); cout << "Two Numbers: "; copy(two_nums.begin(), two_nums.end(), ostream_iterator<int>(cout," ")); cout<<"\nAbsolute Value Sum:"<<abs_val<<endl; } catch(exception& e){ cerr<<"Error:"<<e.what()<<'\n'; } return 0; } ``` 此程序首先读取并解析由空格分隔的一系列整数作为输入数据流,接着调用 `findMinAbsSum` 函数处理这些数字以获取满足条件的最佳配对及其对应的绝对值和。最后打印出结果中的两个数以及它们之间的差额绝对值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值