C++中的foreach算法

Jit*_*ani 3 c++

有没有办法从我传递给foreach的函数中获得返回值.

例如:我有,

void myfunction (int i) 
{
        cout << " " << i;
}

vector<int> myvector;
myvector.push_back(10);
for_each (myvector.begin(), myvector.end(), myfunction);
Run Code Online (Sandbox Code Playgroud)

可以说,我想使用一些规则计算向量中的元素数量,我想从myFunction获得返回值,这可能吗?

Unc*_*ens 13

有一个特殊目的std::count(值的计数出现)和std::count_if(当谓词返回true时计数).不要滥用std::for_each它不适合的东西.


GMa*_*ckG 9

for_each将返回您传递的仿函数的副本.这意味着你可以这样做:

template <typename T>
class has_value
{
    has_value(const T& pValue) : mValue(pValue), mFlag(false) {}

    void operator()(const T& pX)
    {
        if (pX == mValue)
            mFlag = true;
    }

    operator bool(void) const { return mFlag; }
private:
    T mValue;
    bool mFlag;
};

bool has_seven = std::for_each(myvector.begin(), myvector.end(), has_value<int>(7));
Run Code Online (Sandbox Code Playgroud)

例如.但是对于计数等,请algorithm查看您的功能是否已存在.(赞count)

  • 这不是可移植的,不能保证`for_each`在将传递的副本应用到输入范围之前不会复制返回值的输入函数,或者它不会制作多个副本并对每个副本应用不同的副本该范围的成员. (3认同)
  • 该标准说"将f在区间[first每次提领迭代器的结果,最后),从第一个开始,进行到最后 - 1.返回:F." SGI网站还说,"For_each在将函数对象应用到每个元素后返回它." 我认为任何返回预先应用副本的实现都是非标准的,对吧?返回值的全部目的是获取应用的仿函数. (3认同)

int*_*nt3 5

不.但你可以创建myfunction一个仿函数,将指针传递给某个内存,并通过该指针存储返回值.

struct MyFunctor {
    int *count;
    MyFunctor(int *count_) : count(count_) { }
    void operator()(int n) {
        if (n > 5) (*count)++;
    }
};

int main() {
    vector<int> vec;
    for (int i=0; i<10; i++) vec.push_back(i);
    int count = 0;
    for_each(vec.begin(), vec.end(), Myfunctor(&count));
    printf("%d\n", count);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编辑:正如评论所指出的那样,我的第一个例子会因为for_each复制而失败MyFunctor,因此我们无法从原始对象中检索返回值.我已经修改了原来的方法; 但你真的应该看看更加优雅的GMan解决方案.我不确定可移植性,但它确实适用于我的gcc(4.4.2).正如其他人提到的那样,尽可能使用<algorithm>提供的东西.

  • 这应该不起作用.仿函数被复制到`for_each`中,并且该副本是重要的.你应该使用`for_each`的返回值. (2认同)