gpt4 book ai didi

c++ - 多次排序容器,使用什么容器和什么方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:03:42 25 4
gpt4 key购买 nike

我有一些数据需要打印,为简单起见,我们假设它是一个容器( vector ),其中包含一些参数。在我程序的不同部分,我需要打印所有按不同参数排序的部分。我的问题是

1.) 选择哪个容器? (我个人选择 vector )。

2.) 哪种方法更好,每次都对整个 vector 进行排序,还是复制该 vector 并将其保存排序更好?在我的解决方案中,我每次都对相同的 vector 进行排序,但由于速度的原因,这可能不是处理巨大 vector 的正确方法。

class Person
{
private:
std::string name;
std::string surname;
int age;
public:
Person(std::string name, std::string surname, int age) : name{ name }, surname{ surname }, age{ age } {};
void print() { std::cout << name << " " << surname << " " << age << std::endl; };
static bool sortName(Person const &A, Person const &B) { return A.name < B.name; };
static bool sortSurname(Person const &A, Person const &B) { return A.surname < B.surname; };
static bool sortAge(Person const &A, Person const &B) { return A.age < B.age; };
};

主要内容:

int main()
{
std::vector<Person> persons;
Person person1("John", "Smith", 30);
Person person2("Mark", "Cooper", 28);
Person person3("George", "Orwell", 19);

persons.push_back(person1);
persons.push_back(person2);
persons.push_back(person3);

std::sort(persons.begin(), persons.end(), Person::sortSurname);
for (int i = 0; i < persons.size(); ++i)
{
persons[i].print();
}

// do some other stuff here ... and then ...
std::sort(persons.begin(), persons.end(), Person::sortName);
for (int i = 0; i < persons.size(); ++i)
{
persons[i].print();
}

// do some other stuff here ... and then ...
std::sort(persons.begin(), persons.end(), Person::sortAge);
for (int i = 0; i < persons.size(); ++i)
{
persons[i].print();
}

return 0;
}

最佳答案

boost::multi_index_container 允许您定义具有任意数量的不同索引或 View 的任意类型的容器。

容器在插入和删除时自动保持索引最新。

这是一个庞大的模板库,需要一点时间来适应,但文档很好,有很多示例。

这是一个用这种方式表达的实现:

#include <iostream>
#include <string>
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/ordered_index.hpp>
#include <boost/multi_index/mem_fun.hpp>

class Person {
private:
std::string name;
std::string surname;
int age;
public:
Person(std::string name, std::string surname, int age) : name{name}, surname{surname}, age{age} {};

auto get_name() const -> const std::string& { return name; }
auto get_surname() const -> const std::string& { return surname; }
auto get_age() const -> int { return age; }

void print() const { std::cout << name << " " << surname << " " << age << std::endl; };
};

namespace bmi = boost::multi_index;

struct by_name {};
struct by_surname {};
struct by_age;
using PersonTable = boost::multi_index_container<Person,
bmi::indexed_by<
bmi::ordered_non_unique<bmi::tag<by_name>, bmi::const_mem_fun<Person,std::string const&,&Person::get_name>>,
bmi::ordered_non_unique<bmi::tag<by_surname>, bmi::const_mem_fun<Person,std::string const&,&Person::get_surname>>,
bmi::ordered_non_unique<bmi::tag<by_age>, bmi::const_mem_fun<Person,int,&Person::get_age>>
>
>;

int main()
{
PersonTable people;
people.insert(Person("John", "Smith", 30));
people.insert(Person("Mark", "Cooper", 28));
people.insert(Person("George", "Orwell", 19));

std::cout << "by name" << std::endl;
for (auto&& person : people.get<by_name>())
{
person.print();
}
std::cout << "\nby surname" << std::endl;
for (auto&& person : people.get<by_surname>())
{
person.print();
}
std::cout << "\nby age" << std::endl;
for (auto&& person : people.get<by_age>())
{
person.print();
}
}

预期输出:

by name
George Orwell 19
John Smith 30
Mark Cooper 28

by surname
Mark Cooper 28
George Orwell 19
John Smith 30

by age
George Orwell 19
Mark Cooper 28
John Smith 30

此处的文档:http://www.boost.org/doc/libs/1_64_0/libs/multi_index/doc/index.html

关于c++ - 多次排序容器,使用什么容器和什么方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44862484/

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