首页 > 解决方案 > 使用 copy_if 函数从第一个向量复制到另一个向量,其中 n 的倍数

问题描述

创建一个包含 20 个随机数的向量。拷贝数,即另一个 B 向量中 n 的倍数。手动输入 n。

示例A向量

8,9,6,4,2,6,8,6,10,101,10,10,101,10,10,101,6,6,12,14.

n=4. B向量将是8,4,8,12

我的程序不打印 B 向量。

#include <iostream>
#include <cstdlib>
#include <vector>
#include <algorithm>
using namespace std;

vector<int> creating()
{
    vector<int> vec;
    for (int i=0; i<20; i++)
    {
        vec.push_back(rand()%9+1);
    }
    return vec;
}

void print(vector<int> &vec)
{
    for (int i=0; i<20; i++)
    {
        cout<<vec[i]<<"   ";
    }
    cout<<endl;
}

bool predicate(int n)
{
    int k;
    cin>>k;
    return (n %k== 0 );
}

vector<int> copying(vector<int> &A)
{
    vector<int> B(20); //int n; cin>>n;
    copy_if(A.begin(), A.end(), B.end(), predicate());
    return B;
}

int main ()
{
    vector<int> vec=creating();
    print(vec);
    vector<int> B=copying(vec);
    print(B);
}

标签: c++algorithmstdvector

解决方案


打印函数工作得很好,但是 copy_if 接收谓词,它为向量 A 中的每个元素调用。所以cin >> k调用了 20 次。

最好调用一次:

int n;
cin >> n;

然后使用内部谓词:

bool predicate(int element, int divider){
   return (element % divider == 0);
}

由于copy_if只接受带有签名的谓词而没有自定义数据,我们应该使用 lambdabool Name(Type element)捕获:n

int n;
cin>>n;

copy_if(A.begin(), A.end(), B.begin(), [=](int em){
   return predicate(em, n);
});

注意还会 vector<int> B(20);创建预先分配了 20 个元素的新向量,这意味着它将从一开始就包含 20 个元素。而 copy_if 应该B.begin()使用B.end().

如果要添加元素而不是复制,请在没有预分配元素的情况下初始化 B 并back_inserter(B)改用B.begin()


推荐阅读