根据不同大小和类型的另一个向量排序点向量

时间:2013-10-20 05:22:33

标签: c++ sorting vector

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

我正在尝试使用类型为std :: string的另一个向量来定义类型为struct Item的向量。为此,我使用struct Item的一个元素(类型为std :: string的ID),并将其与字符串向量进行比较。

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);

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

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

2 个答案:

答案 0 :(得分:1)

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

bool operator() (const item& x, const item& y) {
    return x.ID.compare(y.ID)
}

要在std::sort中使用它。 另外,如果您的所有商品都可以转换为字符串,则可能需要定义从itemstd::string的转化

item::operator std::string() const {return ID}

答案 1 :(得分:0)

由于您没有显示iitem

的定义

所以,可能你需要这个:

 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] ;
    }

为项目

重载==

这可以根据special中元素的确切数量对all进行排序。如果不是这种情况,那么您将获得XY problem