C++ 基于另一个不同大小和类型的向量对点向量进行排序
为了进一步回答这个问题:,但两个向量都有不同的类型 我正试图根据std::string类型的另一个向量对struct Item类型的向量进行排序。为此,我使用struct项的一个元素(类型为std::string的ID),并将其与字符串向量进行比较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
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
与vectorall
中的字符串具有相同的顺序?如果是,则具有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