我認爲一個位掩碼存儲在容器(在系統上支持位掩碼超過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