使用lambda函数从std :: vector中删除特定的块

时间:2016-05-25 23:38:09

标签: c++ c++11 vector lambda

编辑:对不起,我没有提出任何结果。我期望删除(第10,11),然后(第20,第21),然后(第30,第31)等等,但我得到这个http://imgur.com/TbVmLo4

我有一个由几个相同大小的矢量组成的矢量,我想使用删除if lambda函数来摆脱它们的一部分,但似乎在移除中是一个位移。这是我正在运行的代码:

#include <vector>
#include <numeric>
#include <iostream>
#include <algorithm>
#include <cctype>
#include <cmath>
#include <typeinfo>


int main()
{
   int sizeOfSpectrum=10;
   int desiredSizeOfSpectrum=8;
   int count=-1;
   std::vector<int> v(100);
   std::iota (std::begin(v), std::end(v), 0);
   auto newend=std::remove_if(v.begin(),v.end(),[&](int i)->bool{
                   count++;
                   int temp=count%sizeOfSpectrum;
                   bool test=(temp) > desiredSizeOfSpectrum;
                   return ( test);
               });
   v.erase(newend, v.end());
   std::cout << "\n";
   std::cout << "v[i]: \n";
   for(int i : v)std::cout <<v[i]<<": ";
   std::cout << "\n";
   return 0;
}

1 个答案:

答案 0 :(得分:2)

问题出在这一行:

for(int i : v)std::cout <<v[i]<<": ";

当此行运行时,i将获得向量的每个元素的内容的值。您将此作为索引处理为向量,而不是值。

改为使用:

for(int i : v)
   std::cout <<i<<": ";

注意:你仍然不会得到你想要的输出,但这应该足以让你自己解决这个问题。