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

Posted

技术标签:

【中文标题】根据另一个不同大小和类型的向量对点向量进行排序【英文标题】:Order a vector of points based on another vector of different size and type 【发布时间】:2013-10-20 05:22:33 【问题描述】:

进一步回答这个问题: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&,const std::string &)' : 无法将参数 1 从 'item' 转换为 'const std::string &'

item.ID 是 std::string 类型。

【问题讨论】:

显然你的 bool operator() (const std::string&amp; i, const item&amp; j) 的第一个论点是错误的。告诉i是什么? item.ID 与向量all 中的字符串具有相同的顺序时,您是否尝试以某种方式订购vector special?如果是这样,vector all 所有当前存在的item.ID 吗? vector all 只是一些字符串的向量。创建了一个子集,向量特殊,它是一个结构。更多结构信息添加到向量特殊。但我需要特殊向量基于与向量全部相同的顺序。为了比较它们,我使用了一个向量特殊元素 ID,即 std::string。 但是你没有回答。无论如何,如果我正确理解您的比较功能bool operator() (const item&amp; i, const item&amp; j) return std::find(all.begin(), all.end(), i.ID) &lt; std::find(all.begin(), all.end(), j.ID); 【参考方案1】:

您正在对item 中的std::vector&lt;item&gt; 进行排序,但您的谓词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

【讨论】:

k,我理解你的意思,但我正在尝试根据字符串向量按其中一个元素对结构向量进行排序。 根据您提供的信息,很难说出您正在尝试做什么。如果您发布更多代码以及您想要得到什么,我们可能会为您提供帮助 我不是我能展示的东西。基本上,我试图根据另一个向量订购一个向量。条件比较两个字符串。但是一个字符串在结构的元素中。一个结构体在一个向量中,排序应该基于的向量是另一个字符串向量。【参考方案2】:

由于您没有显示您对 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] ;
    

为项目重载==

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

【讨论】:

我正在尝试根据 std::string 类型的向量,使用其中一个结构元素(std::string 类型)对结构向量进行排序。 @user1007692 那么,您是否愿意展示一下,您的结构 item 中的数据成员是什么? 唯一相关的是Item.ID。这就是我用来与其他向量进行比较的方法。 Item.ID 是一个 std::string。 @user1007692 你没有帮助,反正现在更新了帖子中提到的任何内容 @user1007692 另外你知道排序需要比较来自相同数据结构的两个元素吗?如果是,请说明您希望如何将来自specialij 与来自运算符() 中的all 的元素进行比较。给出a.IDb.ID的简单单词与另一个ID比较,返回0,1,-1

以上是关于根据另一个不同大小和类型的向量对点向量进行排序的主要内容,如果未能解决你的问题,请参考以下文章

c ++如何按类类型对向量进行排序

如何对 <class*> 类型的向量进行排序? [复制]

根据额外参数对向量进行排序

在 C++ 中,是不是可以针对这些对象的任何属性轻松地对对象类型指针的向量进行排序?

Armadillo C++:根据其他两个向量对向量进行排序

按给定轴的角度对点进行排序?