【问题标题】:how do I use STL algorithms with a vector of pointers如何使用带有指针向量的 STL 算法
【发布时间】:2010-10-24 09:56:22
【问题描述】:

我有一个不属于容器的指针向量。如何在指针的目标上使用算法。我尝试使用 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 循环会起作用,但这发生在很多地方,所以某种一元适配器?我找不到一个。提前致谢!

【问题讨论】:

  • 如果您在问题中使用尚未批准的未来 C++ 标准的功能,您将限制您获得的答案。不清楚您的问题是关于当前标准库、Boost 的使用还是 C++0x 的新特性。
  • 看起来 v 应该是整数的平均值,但随后复制行尝试复制到 v,因此 v 必须是指针或迭代器。
  • 哦,是的,最后一行是错误的......我的意思是写“填充”而不是“复制”。
  • Neil:关于标签,我不确定标准库(它是适配器吗?)、boost(它是迭代器吗?)或C++0x(它是新的 lambdas 吗?)。但是,您是对的,在我的示例代码中使用 auto 可能是不必要的。

标签: c++ stl boost lambda c++11


【解决方案1】:

您可以使用Boost Indirect Iterator。取消引用时(使用 operator*() ),它会应用 一个额外的 取消引用,因此您最终会得到迭代器引用的指针所指向的值。更多信息,您还可以查看this question about a dereference iterator

这是一个简单的例子:

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

【讨论】:

  • 哦,很好,这是你的问题——传递知识的方式;)
【解决方案2】:
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 一号线中用到的函数:

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; }

【讨论】:

  • 谢谢,从您的回复中学到了很多。我可能会在这里使用 boost 间接迭代器,但很高兴知道如何使用 bind1st、bind2nd 等等。
  • 是的,STL 很强大,值得了解所有这些单行代码,如累积等。
【解决方案3】:

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

【讨论】:

  • 问题是指针指向其他对象的成员变量。我也可以将它们变成 shared_ptr,但这可能不是最有效的方法。
猜你喜欢
  • 1970-01-01
  • 2010-09-20
  • 1970-01-01
  • 1970-01-01
  • 2017-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多