wai*_*r92 4 c++ sorting containers vector
我有一些我需要打印的数据,为简单起见,我们说这是一个有一些参数的人的容器(矢量).在我的程序的不同部分,我需要打印所有按不同参数排序的部分.我的问题是
1.)选择哪个容器?(我个人选择了矢量).
2.)什么方法更好,每次都对整个矢量进行排序,或者最好制作该矢量的副本并保存它?在我的解决方案中,我每次都对相同的矢量进行排序,但由于速度的原因,可能不是一个使用大型矢量的正确方法.
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; };
};
Run Code Online (Sandbox Code Playgroud)
主要:
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;
}
Run Code Online (Sandbox Code Playgroud)
boost::multi_index_container 允许您定义具有任意数量的不同索引或视图的任何类型的容器.
容器在插入和移除时自动保持索引最新.
这是一个庞大的模板库,需要一点时间来习惯,但文档很好,有很多例子.
这是以这种方式表达的实现:
#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();
}
}
Run Code Online (Sandbox Code Playgroud)
预期产量:
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
Run Code Online (Sandbox Code Playgroud)
文档:http://www.boost.org/doc/libs/1_64_0/libs/multi_index/doc/index.html