c++ - 如何改进以下 lambda 函数以查找向量中的前 4 个元素
问题描述
为了练习,我尝试使用 copy_if 从整数向量中复制不同于 2 的前 4 个条目。
这似乎可行,但如果有更好的方法来编写这个 lambda,那么我想学习正确的方法。干杯。
vector<int> first_vector = {2,8,50,2,4,5,9,12};
vector<int> second_vector (first_vector.size());
int count_elem=0;
auto it = copy_if(first_vector.begin(),first_vector.end(),second_vector.begin(),
[&count_elem]
(int i){
if(i!=2 && count_elem!=4)
{
count_elem++;
return 1;
}
return 0;});
解决方案
由于您没有将所有值从 复制first_vector
到second_vector
,因此您不应初始化second_vector
以保存与 相同数量的元素first_vector
。您正在创建比您想要的更多的元素,其中额外的元素被初始化为0
.
我会建议reserve()
'ing 的大小,second_vector
然后std::back_inserter
用作要复制到的目标迭代器。这样,second_vector
最终只得到你想要推送的值,没有别的。
这也将消除对count_elem
变量的需求。您可以使用second_vector.size()
来了解已将多少值推入向量中。
std::vector<int> first_vector = {2, 8, 50, 2, 4, 5, 9, 12};
std::vector<int> second_vector;
second_vector.reserve(4);
std::copy_if(
first_vector.begin(), first_vector.end(),
std::back_inserter(second_vector),
[&](int i){
return ((i != 2) && (second_vector.size() < 4));
}
);
但是请注意,这种使用std::copy_if()
将遍历整个first_vector
,一旦将 4 个值推送到 ,它就不会停止迭代second_vector
。简单地运行你自己的循环会更有效,这样你就可以尽快打破它:
std::vector<int> first_vector = {2, 8, 50, 2, 4, 5, 9, 12};
std::vector<int> second_vector;
second_vector.reserve(4);
for(int i : first_vector) {
if (i != 2) {
second_vector.push_back(i);
if (second_vector.size() == 4)
break;
}
}
推荐阅读
- web-scraping - 在登录页面中使用 FormRequest 登录没有任何效果(重定向 302)
- python - python - 如何使用shutil.make_archive()在python中创建没有文件扩展名的zip存档?
- python - 在 div 类下抓取子 div
- firebase - 从 Flutter 中的 firebase 提取数据时,我无法访问数据
- typescript - 在 Typescript 中的表达式之后的方括号
- javascript - 页面加载后幻灯片轮播不起作用
- javascript - 如何使节点js成为exe文件
- docker - 正确的 IP 地址以访问 apache docker 容器中的 Web 应用程序
- javascript - SignalR 多用户实时聊天去同步
- react-native - 将日期更改为字符串格式