我认为一个位掩码存储在容器(在系统上支持位掩码超过sizeof(uintmax_t)
位)。在这种情况下溶液的本质是:
std::remove_copy_if(v.begin(), v.end(), std::back_inserter(out),
!*boost::lambda::var(pred)++);
凡v
- 输入向量; out
- 存储结果的向量; pred
- 位掩码上的迭代器。
如果想避免boost::lambda
,则很容易模拟:
template <class InputIterator, class OutputIterator, class PredicateIterator>
void copy_if(InputIterator first, InputIterator last, OutputIterator result,
PredicateIterator pred) {
for (; first != last; ++first)
if (*pred++)
*result++ = *first;
}
它可以如下(使用相同的表示法,如上面的例子)使用:
copy_if(v.begin(), v.end(), std::back_inserter(out), pred);
或使用谓词相同:
template <class Iterator>
class Pred {
Iterator it;
public:
Pred(Iterator it_) : it(it_) {}
template <class T>
bool operator()(T /* ignore argument */) { return !*it++; }
};
template <class Iterator>
Pred<Iterator> iterator2predicate(Iterator it) {
return Pred<Iterator>(it);
}
可按如下方式使用:
std::remove_copy_if(v.begin(), v.end(), std::back_inserter(out),
iterator2predicate(pred));
实施例(使用boost::lambda
,但它很容易通过上述两个其他选项来代替它):
/** g++ -Wall -Ipath/to/boost -o filter_array filter_array.cpp */
#include <algorithm>
#include <iostream>
#include <iterator> // back_inserter()
#include <vector>
#include <boost/lambda/lambda.hpp>
#define LEN(array) (sizeof(array)/sizeof(*(array)))
#define P(v) { std::for_each(v.begin(), v.end(), \
std::cout << boost::lambda::_1 << " "); \
std::cout << std::endl; }
int main() {
int a[] = {123, 345, 678, 890, 555,};
const size_t n = LEN(a);
bool bits[][n] = {
1, 0, 1, 0, 0,
0, 0, 1, 1, 0,
0, 0, 0, 0, 1,
};
typedef std::vector<int> Array;
Array v(a, a + n);
P(v);
for (size_t i = 0; i < LEN(bits); ++i) {
Array out;
std::vector<bool> b(bits[i], bits[i] + LEN(bits[i]));
std::vector<bool>::const_iterator pred = b.begin();
P(b);
std::remove_copy_if(v.begin(), v.end(), std::back_inserter(out),
!*boost::lambda::var(pred)++);
P(out);
}
}
输出:
123 345 678 890 555
1 0 1 0 0
123 678
0 0 1 1 0
678 890
0 0 0 0 1
555
是它总是两个值返回?并且价值观总是一样的?或者它们是否由向量中的特定索引确定?我想你将不得不详细说明 – 2009-02-12 05:13:33
不,它可以是任意数量的值,矢量大小是动态的 – kal 2009-02-12 05:13:52