i你哟 发表于 2023-11-19 21:21:01

C++流迭代器

        ifstream aa("data.txt");
        ofstream bb("out.txt");
        istream_iterator<int>in(aa),eof;
        ostream_iterator<int>on(bb," ");
        vector<int> data(in, eof);
        auto kk = find_if(data.begin(),data.end(),[](const int &a) {return a%2 == 0;});
        data.erase(kk,data.end());
       if (kk != data.end()) {
      data.erase(kk, data.end());
    }
        copy(data.begin(),data.end(),on);

一下是data.txt

123 10 20 30
456 798 456 859
本意是打印偶数,而这个程序却只打印了了123,这是为什么,哪里有问题吗?

Mike_python小 发表于 2023-11-19 21:21:57

在你提供的代码中,存在一些问题导致程序没有按预期工作。我来帮你找出问题所在。

首先,让我们来看一下代码中的问题:


ifstream aa("data.txt");
ofstream bb("out.txt");
istream_iterator<int> in(aa), eof;
ostream_iterator<int> on(bb, " ");
vector<int> data(in, eof);
auto kk = find_if(data.begin(), data.end(), [](const int &a) {return a % 2 == 0;});
data.erase(kk, data.end());
if (kk != data.end()) {
    data.erase(kk, data.end());
}
copy(data.begin(), data.end(), on);


在这段代码中,你首先从文件"data.txt"中读取数据到data向量中,然后使用find_if查找第一个偶数,并删除其之后的所有元素。接着又尝试删除一遍,这会导致问题。

解决办法是在找到偶数后不要立即删除,而应该先找到所有偶数的位置,然后再统一删除。下面是修改后的代码:


ifstream aa("data.txt");
ofstream bb("out.txt");
istream_iterator<int> in(aa), eof;
ostream_iterator<int> on(bb, " ");
vector<int> data(in, eof);

// 找到所有偶数的位置
auto evenEnd = remove_if(data.begin(), data.end(), [](int a){ return (a % 2) != 0; });

// 删除后面的非偶数元素
data.erase(evenEnd, data.end());

// 将偶数数据写入文件
copy(data.begin(), data.end(), on);


通过使用remove_if算法,我们可以将不满足条件的元素移动到容器的尾部,并得到一个迭代器evenEnd,指向第一个不满足条件的元素。然后我们删除evenEnd之后的所有元素,并将偶数数据写入文件。

希望以上修改能够解决你的问题。如果还有其他问题,请随时提问。
页: [1]
查看完整版本: C++流迭代器