gpt4 book ai didi

c++ - 指向另一个 vector 的对象的指针 vector - 初始化和排序

转载 作者:行者123 更新时间:2023-11-28 06:01:04 25 4
gpt4 key购买 nike

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

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

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

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

例子.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;
}

最佳答案

在我看来,第一个 vector 是一条红鲱鱼,这样可以:

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;

关于c++ - 指向另一个 vector 的对象的指针 vector - 初始化和排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33283628/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com