12

我有一个不属于容器的指针向量。如何在指针的目标上使用算法。我尝试使用 boost 的 ptr_vector,但它会在超出范围时尝试删除指针。

这是一些需要工作的代码:

vector<int*> myValues;
// ... myValues is populated
bool consistent = count(myValues.begin(), myValues.end(), myValues.front()) == myValues.size();
auto v = consistent ? myValues.front() : accumulate(myValues.begin(), myValues.end(), 0) / myValues.size();
fill(myValues.begin(), myValues.end(), v);
// etc.

我意识到 for 循环会起作用,但这发生在很多地方,所以某种一元适配器?我找不到一个。提前致谢!

4

3 回答 3

19

您可以使用Boost Indirect Iterator。当取消引用(使用operator*())时,它会应用额外的取消引用,因此您最终会得到迭代器引用的指针所指向的值。有关更多信息,您还可以查看有关取消引用迭代器的这个问题

这是一个简单的例子:

std::vector<int*> vec;

vec.push_back(new int(1));
vec.push_back(new int(2));

std::copy(boost::make_indirect_iterator(vec.begin()),
          boost::make_indirect_iterator(vec.end()),
          std::ostream_iterator<int>(std::cout, " "));     // Prints 1 2
于 2009-05-07T07:37:58.213 回答
3
bool consistent = count_if(myValues.begin(), myValues.end(), 
   bind2nd(ptr_fun(compare_ptr), *myValues.front())) == myValues.size();

int v = consistent ? *myValues.front() : accumulate(
   myValues.begin(), myValues.end(), 0, sum_int_ptr) / myValues.size();

for_each(myValues.begin(), myValues.end(), bind1st(ptr_fun(assign_ptr),v));

Fill 不能采用分配函数(以便取消引用指针)。因此使用了 for_each()。为了优化,在运行 for_each() 之前添加 if(!consistent) 是明智的。上述 STL one liner 中使用的函数:

int sum_int_ptr(int total, int * a) { return total + *a; }    
void assign_ptr(int v, int *ptr) { *ptr = v; }    
bool compare_ptr(int* a, int pattern) { return *a == pattern; }
于 2009-05-07T07:51:22.177 回答
0

您可以查看boost::shared_ptr<>- 具有引用计数的智能指针。超出范围后它不会删除指针。

于 2009-05-07T07:37:37.200 回答