首页 > 解决方案 > 如何改进以下 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;});

标签: c++lambdac++17

解决方案


由于您没有将所有值从 复制first_vectorsecond_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;
    }
}

推荐阅读