我有两个向量
std::vector<int> markedToBeRead(7); // contains: 1,1,0,0,1,0,1
std::vector<float> myVec(7); // contains: 1,2,3,4,5,6,7
从myVec中获取这些元素的最佳方法是什么,其中 markedToBeRead
的相应索引具有值 1
.
这可能不使用for循环,但使用stl方法?
std::vector<float> myResult; // contains: 1,2,5,7
谢谢!
5 回答
显然,这里非常优选简单的for循环而不是任何STL算法 .
但是作为一个概念的证明,人们可以在这里采用stl :: equals和一个来自C 11的lambda:
这有效,但看起来很难看 .
以下是我为此编写算法的方法:
这样称呼:
(
std::begin
和std::end
需要C 11 . )也就是说,库中的正确实现可能会使用
enable_if
(或static_assert
)来确保所使用的迭代器类型与其使用兼容,即I
是输入迭代器,O
是兼容的输出迭代器,M
是输入迭代器,value_type
是bool
. 不幸的是,缺乏概念会导致真正的模板爆炸 .在功能方面,这很简单:它是两个输入范围的拉链,然后标记上的过滤器为1,接着是map以仅提取值 .
不幸的是,C标准算法并不是创造中间容器,你可以应用
transform
的二进制版本,然后是copy_if
(或C03中的remove_copy_if
,谓词反转,或remove_if
来修改你的中间容器),然后是transform
的一元版本 .或者,Boost以迭代器适配器的形式提供前两个操作 . 像这样(未经测试):
你现在可能已经确信(a)循环更好,而且(b)用C替换循环是一种观察性运动;-)
如果需要链接进一步的操作,那么
std::transform
也可以用迭代器适配器替换:transform_iterator
.这样的事情?
这对我有用:
Tested on Ideone.