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

C++ 基于另一个不同大小和类型的向量对点向量进行排序,c++,sorting,vector,C++,Sorting,Vector,为了进一步回答这个问题:,但两个向量都有不同的类型 我正试图根据std::string类型的另一个向量对struct Item类型的向量进行排序。为此,我使用struct项的一个元素(类型为std::string的ID),并将其与字符串向量进行比较 struct myCompareStruct { std::vector<std::string> all; std::vector<item> special; myCompareStruct(con

为了进一步回答这个问题:,但两个向量都有不同的类型

我正试图根据std::string类型的另一个向量对struct Item类型的向量进行排序。为此,我使用struct项的一个元素(类型为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);
struct mycomparstruct
{
std::矢量all;
std::特殊载体;
myComparstruct(常数std::vector&a,常数std::vector&s)
:全部(a)、特殊(s)
{
}
布尔运算符()(常数std::string&i,常数项&j)
{ 
返回(i.compare(j.ID)==0);
}
};
std::矢量all;
std::特殊载体;
//填充向量
MyComparstruct compareObject(全部、特殊);
std::sort(special.begin()、special.end()、compareObject);
但这给了我一个编译时错误: 错误C2664:“bool mycomparstruct::operator()(const item&,const std::string&”):无法将参数1从“item”转换为“const std::string&”


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

您正在对
项的
std::vector
进行排序,但是您的谓词
mycomparstruct::operator()
无法比较两个
,它比较
std::string
。您需要编写这样的运算符

bool operator() (const item& x, const item& y) {
    return x.ID.compare(y.ID)
}
为了在
std::sort
中使用它。 另外,如果您的所有项目都可以转换为字符串,您可能需要定义从
项目
标准::字符串
的转换

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

由于没有显示
i
项的定义

所以,你可能需要这个:

 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] ;
    }
bool操作符()(常数std::item&i,常数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();
返回所有[pos1]<所有[pos2];
}
项目过载
==


这可以根据
all
中元素的确切数量对
special
进行排序。如果不是这种情况,您的
bool操作符()显然是
const std::string&i,const item&j)
的第一个参数是错误的。告诉我什么是
i
?您是否试图在
item.ID
与vector
all
中的字符串具有相同的顺序?如果是,则具有
vector all
当前存在的所有
item.ID
?vector all只是一些字符串的一个向量。一个子集合被创建,vector special是一个结构。更多的结构信息被添加到vector special。但是我需要vector special基于与vector all相同的顺序。为了比较它们,我使用vector special的一个元素ID,它是std::string。但是你没有回答。无论如何,如果我正确理解你的比较函数
bool操作符()(const-item&i,const-item&j){return std::find(all.begin(),all.end(),i.ID)
k,我理解你的观点,但我正在尝试根据字符串向量按其元素之一对结构向量进行排序。根据你提供的信息,很难判断你到底想做什么。如果你发布更多的代码,以及你想要得到什么,我们可能能够帮助你。我不能再做更多了。基本上首先,我尝试基于另一个向量对一个向量进行排序。该条件比较两个字符串。但一个字符串位于结构的元素中。一个结构位于向量中,排序应基于的向量是另一个字符串向量。我尝试使用一个结构元素(类型为std::string)对结构的向量进行排序,基于std::string类型的向量。@user1007692那么您想显示结构
中的数据成员是什么吗?唯一相关的是item.ID。这就是我用来与另一个向量进行比较的内容。item.ID是std::string。@user1007692您没有帮助,不管怎么说,更新了帖子中提到的内容now@user1007692您是否意识到,为了进行排序,您需要比较同一数据结构中的两个元素?如果是,请说明如何将运算符
中的
i
j
special
中的
all
中的元素进行比较()
。给定的简单单词
a.ID
b.ID
将它们与另一个
ID
进行比较,返回0,1,-1