需要帮助从结构向量中搜索元素

need help to search element from vector of struct

本文关键字:搜索 元素 向量 结构 帮助      更新时间:2023-10-16

我有struct partationPartItemTag_t类型的向量

typedef struct partationPartItemTag
{
    std::string partition;
    std::string partGroupId;
    std::string mathTuid;
    std::string partNumber;
    tag_t itemTag;
}partationPartItemTag_t;

我想从向量中找到具有partition == 'a'partGroupId == 'b'值的元素

我编写了以下代码,并且可以在 C++11 中正常工作但是现在我想修改此代码,因为我没有c ++ 11支持

partationPartItemTag_t mi={'a', 'b'};
vector<partationPartItemTag_t> searchlist;
searchlist.push_back(mi);
vector<partationPartItemTag_t>::iterator flag = std::search(partationPartItemTagVec.begin(),partationPartItemTagVec.end(),searchlist.begin(),searchlist.end(),[](partationPartItemTag_t &x, partationPartItemTag_t &y){
    return ((x.partition.compare(y.partition) == 0) && (x.partGroupId.compare(y.partGroupId) == 0));  
});

请帮我修改此代码,我看到函数指针的帖子很少,但我无法使用函数指针进行转换注意:我想在结构中查看 2 个成员的值,但我不能使用 lambda 函数或 c++11

提前谢谢。

lambda 只是一个方便的函子,它被引入,以便您可以更轻松地编写这些算法。

但这只是一种方便。如果你在这种情况下不能使用它们,那不是世界末日。毕竟,我们很多年都做不到。解决方案是回到使用函子:

struct SearchFor
{
    /* ctor omitted for brevity */
    std::string partition, partGroupId;
    bool operator()(const partationPartItemTag_t& elem) const 
    {
        return elem.partition == partition && 
               elem.partGroupId == partGroupId;
    }
};

然后内联使用它:

vector<partationPartItemTag_t>::iterator flag = 
    std::find_if(partationPartItemTagVec.begin(),
                 partationPartItemTagVec.end(),
                 SearchFor("a", "b"));

如果您需要从 C++11 转换为 C++098,更好的选择是用函子替换 lambda。

如下方式定义函子compare,并在算法中调用它来代替 lambda。

struct  compare 
{
        bool operator(partationPartItemTag_t x, partationPartItemTag_t y) const
        {
            return ((x.partition.compare(y.partition) == 0) && 
             (x.partGroupId.compare(y.partGroupId) == 0) );        
        }
}
std::search(partationPartItemTagVec.begin(),
            partationPartItemTagVec.end(),
            searchlist.begin(),searchlist.end(),
compare(partationPartItemTag_t &x, partationPartItemTag_t &y) );