Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 带函子的STL算法复制if_C++_Algorithm_C++11_Stl - Fatal编程技术网

C++ 带函子的STL算法复制if

C++ 带函子的STL算法复制if,c++,algorithm,c++11,stl,C++,Algorithm,C++11,Stl,哪种算法或算法组合可用于以下情况 struct Term { int ix; double f; }; std::vector<Term> terms = <intitalize terms>; std::vector< int > termIxVector; // NEED get all `ix` from the `terms` where term.f < 1.0, // and insert 'ix' result

哪种算法或算法组合可用于以下情况

struct Term
{
    int ix;
    double f;
};

std::vector<Term> terms = <intitalize terms>;
std::vector< int > termIxVector;

// NEED get all `ix` from the `terms` where term.f < 1.0, 
   // and insert 'ix' result to termIxVector.
//i.e. equavalent this loop:
for(std::size_t i = 0; i < terms.size(); ++i)
    if ( terms[i].f < 1.0 )
             termIxVector.push_back(terms[i].ix);
结构术语 { int ix; 双f; }; 向量项=; std::vectortermIxVector; //需要从'terms'中获取所有'ix',其中term.f<1.0, //并将“ix”结果插入termIxVector。 //i、 e.使该回路相等: 对于(std::size_t i=0;i
std::如果只复制术语结构,则复制_。std::transform-不支持谓词。

使用带有lambda的
std::for_each

std::for_each(terms.begin(), terms.end(), 
              [&termIxVector](Term const& t) { 
                  if(t.f < 1.0) termIxVector.push_back(t.ix); 
              });

使用带有lambda的
std::for_each

std::for_each(terms.begin(), terms.end(), 
              [&termIxVector](Term const& t) { 
                  if(t.f < 1.0) termIxVector.push_back(t.ix); 
              });

如果您真的想使用
std::copy_If
,那么一个想法是在结构中重载
操作符int()
,并使用标准
std::copy_If
和一元谓词(lambda或functor),因为这将允许您将
Term
转换为
int
。代码如下:

#include <algorithm>
#include <iostream>
#include <iterator>
#include <vector>

struct Term{
    int ix;
    double f;
    operator int(){
        return ix;
    }
};

struct predicate{ // if you don't want a lambda
    bool operator()(const Term& t){
        return (t.f < 1.0 ? true : false);
    }
};

int main()
{
    std::vector<Term> terms = {{1, 0.1}, {2, 0.2}, {3, 1.1}, {4, 0.9}};
    std::vector< int > termIxVector;

    std::copy_if(terms.begin(), terms.end(), 
                 back_inserter(termIxVector), predicate());

    for(auto& elem: termIxVector)
        std::cout << elem << std::endl;
}
#包括
#包括
#包括
#包括
结构术语{
int ix;
双f;
运算符int(){
返回ix;
}
};
结构谓词{//如果不需要lambda
布尔运算符()(常数项和t){
返回值(t.f<1.0?真:假);
}
};
int main()
{
向量项={1,0.1},{2,0.2},{3,1.1},{4,0.9};
std::vectortermIxVector;
std::copy_if(terms.begin(),terms.end(),
back_插入器(termIxVector),谓词();
用于(自动和元素:termIxVector)

std::cout如果您真的想使用
std::copy_If
,那么一个想法是在结构中重载
操作符int()
,并使用标准的
std::copy_If
和一元谓词(lambda或functor),因为这将允许您将
术语
转换为
int
。代码如下:

#include <algorithm>
#include <iostream>
#include <iterator>
#include <vector>

struct Term{
    int ix;
    double f;
    operator int(){
        return ix;
    }
};

struct predicate{ // if you don't want a lambda
    bool operator()(const Term& t){
        return (t.f < 1.0 ? true : false);
    }
};

int main()
{
    std::vector<Term> terms = {{1, 0.1}, {2, 0.2}, {3, 1.1}, {4, 0.9}};
    std::vector< int > termIxVector;

    std::copy_if(terms.begin(), terms.end(), 
                 back_inserter(termIxVector), predicate());

    for(auto& elem: termIxVector)
        std::cout << elem << std::endl;
}
#包括
#包括
#包括
#包括
结构术语{
int ix;
双f;
运算符int(){
返回ix;
}
};
结构谓词{//如果不需要lambda
布尔运算符()(常数项和t){
返回值(t.f<1.0?真:假);
}
};
int main()
{
向量项={1,0.1},{2,0.2},{3,1.1},{4,0.9};
std::vectortermIxVector;
std::copy_if(terms.begin(),terms.end(),
back_插入器(termIxVector),谓词();
用于(自动和元素:termIxVector)

std::cout这些基本算法的组合最方便使用:


这些基本算法的合成最方便的方法是:


一个普通的(基于范围的)for循环应该足够了。或者如果你真的想要一个
,那么每个
std::for\u都
。这不适合你吗?一个普通的(基于范围的)for循环应该足够了。如果您真的想要一个
,或者
std::for\u each
。这不适合您吗?抱歉,但我使用的是Visual Studio 2010,它不支持带有捕获的lambda(简单的lambda可以),和基于范围的“for”也不能支持。如果没有lambda和基于范围的“for”方式,你不能显示吗?我更喜欢算法的组合。VS2010支持lambda和捕获,我们一直都在使用它们。@Khurshid你从VS2010中得到了什么错误?我不再安装它,但我似乎记得捕获变量的lambda如果您没有显式地命名要捕获的变量,该怎么办?
[&](Term const&t){…}
@Praetorian:VS2010-仅支持通过引用捕获lambda,通过值显式捕获不支持——通常VS2010 100%不支持C++11 lambda。@Khurshid我不知道你在说什么。我是通过引用捕获向量,而不是通过值。而且,我非常确定VS2010支持两者。如果我没记错的话,仅它不支持将无捕获lambda隐式转换为函数指针。请尝试代码,并发布您看到的任何错误。这里没有其他有趣的算法组合可供使用。每个
只需要一个-
。如果您不想使用lambda,可以手动创建一个函子,但它是essen与lambda基本相同。抱歉,我使用的是Visual Studio 2010,它不支持带有捕获的lambda(简单的lambda可以),和基于范围的“for”也不能支持。如果没有lambda和基于范围的“for”方式,你不能显示吗?我更喜欢算法的组合。VS2010支持lambda和捕获,我们一直都在使用它们。@Khurshid你从VS2010中得到了什么错误?我不再安装它,但我似乎记得捕获变量的lambda如果您没有显式地命名要捕获的变量,该怎么办?
[&](Term const&t){…}
@Praetorian:VS2010-仅支持通过引用捕获lambda,通过值显式捕获不支持——通常VS2010 100%不支持C++11 lambda。@Khurshid我不知道你在说什么。我是通过引用捕获向量,而不是通过值。而且,我非常确定VS2010支持两者。如果我没记错的话,仅它不支持将无捕获lambda隐式转换为函数指针。请尝试代码,并发布您看到的任何错误。这里没有其他有趣的算法组合可供使用。每个
只需要一个-
。如果您不想使用lambda,可以手动创建一个函子,但它是essen与lambda基本相同。
std::vector<int> termIxVector;
boost::push_back(termIxVector, /* RHS of the same range composition as above */);