将矢量图的选择性元素减少为矢量

时间:2016-11-21 15:58:10

标签: c++ vector

我的遗留代码简化如下:

void simplifiedFoo ()
{
  std::vector<int> returnVal;
  std::map<int, std::vector<int> > list2D = {{20 , {10,20} }, 
                                              {40 , {500,200}}, 
                                              {100 , {1, 2, 3}} }; 

  auto itlow=list2D.lower_bound (10);               
  auto itup=list2D.lower_bound (50);                
  if ( itlow != list2D.end() && itup == list2D.end() )// Don't like this if even not sure if it is correct.  
     --itup;

  while ( itlow != itup)  // How to avoid second loop
  {
     returnVal.insert(returnVal.end(), itlow->second.begin(), itlow->second.end());
     ++itlow;
  }
  for ( auto elem : returnVal)
    std::cout << elem << " " ; 

  return 0;
}

给定一个范围(数字范围,例如介于10 - 90之间),我需要首先过滤地图,并消除不在数字范围之间的元素。再给出元素

20 - &gt; {10,20},40 - &gt; {500,200},100 - &gt; {1,2,3}给出的范围是10-90 我需要过滤100的那个。

我需要连接所有向量。结果将是{10,20,500,200}。

我的遗留代码是用两个for循环来做的。我打算使用lower_bound函数进行过滤步骤。但似乎我仍然需要一个for循环。简化版可以在下面看到。说实话,2 for for循环的版本看起来更简单。

{{1}}

什么是更好的清洁方式(我需要用vs2010实现这个)?有没有干净的方法我可以在我的案例中实现C ++中的“减少”功能?

2 个答案:

答案 0 :(得分:2)

不确定这是不是您的意思,但如果您正在寻找使用“std oneliners”,这将有效:

  std::for_each(itlow, itup,
      [&returnVal](const auto& elem) {
          returnVal.insert(returnVal.end(), elem.second.begin(), elem.second.end());
      });

现在,我们可以将此“称为”的首选清洁方式吗?我认为这是值得商榷的。

答案 1 :(得分:1)

我认为,您必须使用upper_bound作为第二个值,否则将排除较高的值

auto first = list2D.lower_bound(10);               
auto last = list2D.upper_bound(90);

如果较低的迭代器是!= end()而上面的迭代器是== end(),则不需要检查。所以你的循环就变成了

for (; first != last; ++first) {
    // ...
}

如果上部迭代器等于end(),则等于

for (; first != list2D.end(); ++first) {
    // ...
}