首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于不同大小和类型的另一个向量对点的向量进行排序

基于不同大小和类型的另一个向量对点的向量进行排序
EN

Stack Overflow用户
提问于 2013-10-20 13:22:33
回答 2查看 108关注 0票数 0

进一步这个问题:order a vector of points based on another vector,但这两个向量具有不同的类型。

我正在尝试根据std::string类型的另一个向量对具有struct Item类型的向量进行排序。为此,我使用了struct Item的一个元素(类型为std::string的ID),并将其与字符串向量进行比较。

代码语言:javascript
复制
struct myCompareStruct
{
    std::vector<std::string> all;
    std::vector<item> special;
    myCompareStruct(const std::vector<std::string>& a, const std::vector<item>& s)
        : all(a), special(s) 
    {
    }
    bool operator() (const std::string& i, const item& j) 
    { 
        return(i.compare(j.ID) == 0);
    }
};

std::vector<std::string> all;
std::vector<item> special;

//fill your vectors
myCompareStruct compareObject(all,special);
std::sort(special.begin(), special.end(), compareObject);

但这会给我一个编译时错误: error C2664:'bool myCompareStruct::operator ()(const item&,const std::string &)‘:无法将参数1从'item’转换为'const std::string &‘

item.ID的类型为std::string。

EN

回答 2

Stack Overflow用户

发布于 2013-10-20 13:42:21

您正在对itemstd::vector<item>进行排序,但是您的谓词myCompareStruct::operator()不能比较两个item,它会比较std::stringitem。您需要像这样编写一个运算符

代码语言:javascript
复制
bool operator() (const item& x, const item& y) {
    return x.ID.compare(y.ID)
}

以便在std::sort中使用它。或者,如果您的所有项目都可以转换为字符串,那么您可能希望定义一个从itemstd::string的转换

代码语言:javascript
复制
item::operator std::string() const {return ID}
票数 1
EN

Stack Overflow用户

发布于 2013-10-20 13:46:17

因为您没有显示您对i的定义,所以item

所以,你可能需要这个:

代码语言:javascript
复制
 bool operator() (const std::item& i, const item& j) 
    { 
        size_t pos1 = std::find(special.begin(), special.end(),i) - special.begin() ;
        size_t pos2 = std::find(special.begin(), special.end(),j) - special.begin() ;

        return all[pos1] < all[pos2] ;
    }

重载项目的==

这可以根据all中元素的确切数量对special进行排序。如果情况并非如此,那么您将拥有一个XY problem

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19474212

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档