c++ - 使用 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);
}
解决方案
打印函数工作得很好,但是 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()
推荐阅读
- javascript - 使用 React 下载到 PDF 或预览并保存到 PDF/打印
- apache-spark - 从当前行到具有特定值的行的pyspark窗口函数
- arrays - 从猫鼬中的数组对象中选择具体项目
- c++ - 如何使用 member-Function 制作模板代码
- php - 如何将长数组分解为 PHP 函数返回的子数组?
- flutter - Overlay.of(context) 在 null 上调用
- c# - C# 获取匹配正则表达式的第一个命名组
- javascript - document.body.append(document.createElement('p').innerHTML="this is p") 如果我在单独的语句中给出不同的行为?
- google-cloud-platform - 取消嵌套 BigQuery 中可以包含空元素的列
- wordpress - 使用 docker-compose 和 nginx 在子目录中安装 wordpress