我的遗留代码简化如下:
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 ++中的“减少”功能?
答案 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) {
// ...
}