【问题标题】:Vector of pointers to objects of another vector - initialization and sorting指向另一个向量对象的指针向量 - 初始化和排序
【发布时间】:2015-10-22 14:35:01
【问题描述】:

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

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

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

我给你一个Minimal, Complete, and Verifiable exampleg++ -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;
}

【问题讨论】:

  • 我认为您不想这样做。任何导致vector1 重新分配的东西都会破坏vector2
  • 第二个向量可以是索引的向量而不是指针。
  • 我需要这样做,因为在我的项目中,vector1 中有大量元素,而且它们的类型也相对较大。我认为如果 vector1 充满了 const 值,你说的问题就解决了。
  • @JoachimPileborg:更好地解释你的意思。
  • 就像@NathanOliver 所说,如果第一个向量需要重新分配其数据(如果添加元素可能会发生这种情况),那么指针将变得无效,所有迭​​代器也一样。但是只有当你从向量中删除一个元素时,第一个向量的索引才会变得无效。

标签: c++ sorting pointers vector


【解决方案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;

【讨论】:

  • 是的,如果您将 int* 替换为 MyClass*,这将有效。
  • MyClass内的第一个解决方案中的功能可以实现吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-17
  • 1970-01-01
  • 2014-12-29
  • 1970-01-01
  • 2021-09-20
相关资源
最近更新 更多