【问题标题】:C++ STL algorithms: get pointers of elements in containerC ++ STL算法:获取容器中元素的指针
【发布时间】:2016-04-08 00:22:28
【问题描述】:

我有一个将两个指针作为参数的函数。

bool function(T* a, T* b);

还有一个容器(向量)。

vector<T> vector;

我希望使用 STL 的算法(for_each)将函数应用于向量的元素。但是,我不知道元素的指针是否会作为参数自动进入函数。例如,会

for_each(vector.begin(), vector.end(), function(/*something here?*/))

工作,或者我需要使用循环(C++11 的每个循环中的新循环)?

【问题讨论】:

  • 老实说,我认为 for_each 循环是一种糟糕的方式来做到这一点,但你到底想要做什么?您是否希望将向量 [i] 的每个元素通过函数 (vector[i],vector[i+1])
  • 为什么不是正常的 for 循环?并使用 [i] 访问它
  • 想知道是否有算法的方法,但是是的,我别无选择,需要循环。

标签: c++ algorithm c++11 stl


【解决方案1】:

至少有两个原因,您不能将 std::for_each() 与您的 function 一起使用:

  • std::for_each 将单个参数传递给lamba,您的function() 需要两个参数。

  • std::for_each 传递对容器每个成员的引用,而不是指针。

【讨论】:

  • 可以编写一个接受引用的包装函数,根据该引用获取指向几个对象的指针,并将指针传递给function()
  • 将引用转换为指针很简单(我要告诉你一个小秘密:通常需要 0 个 CPU 周期才能做到这一点)。但是,引用是对单个对象的引用,而不是“一对对象”。
  • 我使用“基于”这个词是有原因的。没有什么可以阻止包装器假设它接收到的引用是 std::vector 的一个元素(就像这个问题中的情况一样)。给定一个元素的地址,就可以推断出其他元素的地址。
  • 当然,但前提是你要小心。如果您假设另一个对象是 for_each() 给您的对象之后的对象,并且您盲目地在整个向量上使用 for_each(),您可能会花费大量时间试图找出代码崩溃的原因,每次.
【解决方案2】:

尝试使用正常的 for 循环来解决此问题。

vector<T> v;
for(size_t i(0); i < v.size()-1; ++i)
{
    function(&v[i], &v[i+1]);
}

这会将地址作为值传递给类型为 T 的 v 的元素 i 和 i+1。

【讨论】:

    猜你喜欢
    • 2011-07-08
    • 1970-01-01
    • 2015-06-06
    • 2012-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-03
    相关资源
    最近更新 更多