stl std :: generate c ++,如何编写函数调用

时间:2016-10-04 20:00:31

标签: c++ stl

所以我有一个编程任务,他们为我们提供了包含以下内容的头文件:

class SEQ{
private:
...// stuff
public:
...//constructor 
string operator ( ) ( ) {
    string tmp = id; int i = nd - 1;
    if ( id [ i ] < '9' ) id [ i ]++;
    else {
        id [ i ] = '1'; bool flag = true;
        for ( i--; i >= 0 && flag; i-- )
            if ( id [ i ] < 'Z' ) { id [ i ]++; flag = false; }
            else id [ i ] = 'A';
    } 
    return tmp;
}
}

我应该在std :: vector上使用std :: generate。但是,函数永远不会被调用。我试过用这些方法写它:

vector<string> v; 
for (int i = v.size(); i < in.N; i++) v.push_back("");

generate(v.begin(), v.end(), SEQ); // compiler error
generate(v.begin(), v.end(), SEQ()); // no error but does nothing

SEQ seq; // declare an instance
generate(v.begin(), v.end(), seq); // no error but does nothing
generate(v.begin(), v.end(), seq()); // compiler error algorithm line 1527 does not evaluate to a function that takes 0 arguments

我假设他们给我的头文件不包含任何错误。我怎么写这个以便调用函数?

1 个答案:

答案 0 :(得分:0)

generate获取函数指针或对仿函数实例的引用。以下两个调用是正确的。如果向量为空,它们是无操作。

// pass a default-constructed temporary instance
generate(v.begin(), v.end(), SEQ{});
// pass a named instance
SEQ seq;
generate(v.begin(), v.end(), seq);

以下作品:

#include <algorithm>
#include <vector>
#include <cassert>

int main()
{
    std::vector<size_t> v(10);
    auto seq = [a = 0]() mutable { return a++; };
    std::generate(v.begin(), v.end(), seq);
    assert(v.begin() != v.end());
    for (size_t i = 0; i < v.size(); ++i)
       assert(v[i] == i);
}