【问题标题】:Removing specific chunks from std::vector using a lambda function使用 lambda 函数从 std::vector 中删除特定块
【发布时间】:2016-09-23 18:38:19
【问题描述】:

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

我有一个由几个相同大小的向量组成的向量,我想使用 remove 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;
}

【问题讨论】:

  • 预期的输出是什么,你得到了什么?我们在这里谈论多少位移?
  • 假设我有一个大小为 100 的向量,由大小为 10 的数据集组成(所以 10 个集合)。我希望删除每组的第 9 和第 10 个元素。但正如你所看到的,它删除了第 10 和第 11,然后是第 10 和第 22,而不是我预期的第 20 和第 21,我不知道这里发生了什么。 imgur.com/TbVmLo4
  • 然后会发生什么?您打印的输出是什么?
  • 我打印屏幕截图上的内容

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


【解决方案1】:

问题出在这一行:

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

当这条线运行时,i 被赋予向量每个元素的 contents 值。您将其视为向量中的 索引,而不是值。

改为使用:

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

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

【讨论】:

  • 非常感谢,我根本没想到问题出在打印功能上。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-24
  • 1970-01-01
  • 1970-01-01
  • 2013-07-11
相关资源
最近更新 更多