指针传染媒介对另一个传染媒介的对象 - 初始化和排序

时间:2015-10-22 14:35:02

标签: c++ sorting pointers vector

我有两个向量。第一个是某类对象的向量。第二个是一个向量,元素指向第一个向量的对象。

我有两个问题要问你。第一个是:有更好或更优雅的方式来声明和初始化指针的向量?

第二个解释起来有点复杂。假设我想按降序查看第一个向量的元素。我所要做的就是重载操作符<并对它们进行排序。好吧,现在假设我希望以降序看到第一个向量的元素而不改变其元素的顺序,但仅在第二个向量的帮助下。换句话说,我想对第二个向量的元素进行排序,看看它们指向的是什么,而不是像往常一样查看它的元素,因为它们是地址。我该怎么办?用其他类型的参数重载运算符<?将另一个订单功能传递给sort

我给你一个Minimal, Complete, and Verifiable example来编译g++ -std=c++11 -o example example.cpp

example.ccp

#include <iostream>
#include <algorithm>
#include <vector>

class MyClass{
    public:
        int a;
        int b;
        MyClass(int a, int b) : a(a), b(b){};
        bool operator<(const MyClass &obj)const{return (this->a + this->b) < (obj.a + obj.b);};
};

int main(int argc, char* argv[]){
    std::vector<MyClass> vector1;
    vector1.push_back({4, 5});
    vector1.push_back({5, 6});
    vector1.push_back({6, 7});
    vector1.push_back({1, 2});
    vector1.push_back({2, 3});
    vector1.push_back({3, 4});

    std::vector<MyClass*> vector2;
    std::vector<MyClass>::iterator i;
    for(i = vector1.begin(); i != vector1.end(); i++)
        vector2.push_back(&(*i));

    std::cout << "element pointed to by vector2 unsorted: " << std::endl;
    for(int j = 0; j < vector2.size(); j++)
        std::cout << vector2[j]->a << " " << vector2[j]->b << std::endl;        

    /* Insert here how I should sort vector2 */
    // std::sort (vector2.begin(), vector2.end());  <-- Obviously this doesn't work

    std::cout << "element pointed to by vector2 sorted: " << std::endl;
    for(int j = 0; j < vector2.size(); j++)
        std::cout << vector2[j]->a << " " << vector2[j]->b << std::endl;    


    return 0;
}

1 个答案:

答案 0 :(得分:1)

听起来像第一个载体是红鲱鱼,这样做:

bool compare(const MyClass* lhs, const MyClass* rhs)
{
    return *lhs < *rhs;
}

std::sort (vector2.begin(), vector2.end(), compare);

存在对vector1的修改时更稳定的变体是存储索引而不是指针:

std::vector<size_t> vector2(vector1.size());
std::iota(vector2.begin(), vector2.end(), 0);

std::sort (vector2.begin(), 
           vector2.end(), 
           [&](int l, int r) { return vector1[l] < vector1[r]; });

std::cout << "element pointed to by vector2 sorted: " << std::endl;
for(int j = 0; j < vector2.size(); j++)
    std::cout << vector1[vector2[j]].a << " " << vector1[vector2[j]].b << std::endl;