Вы должны создать один Shape
класс или структуру, а затем создать std::vector<Shape>
, который затем можно будет отсортировать по цвету, в первую очередь, а затем другие параметры. Вы определяете перегруженный operator<
так, чтобы функция std::sort
находила его.
Это выглядело бы так:
#include <algorithm>
#include <iostream>
#include <string>
#include <tuple>
#include <vector>
struct Shape
{
std::string color_;
std::string shape_;
int size_;
Shape(const std::string& color, const std::string& shape, int size)
: color_(color)
, shape_(shape)
, size_(size)
{}
// returns true if this shape is less than the other shape
// "less than" is up to us: here we give priority to color, then shape, then size
bool operator<(const Shape& other) const
{
// std::tie makes lexicographical compare of complex structures easy!
return (std::tie(color_, shape_, size_) <
std::tie(other.color_, other.shape_, other.size_));
}
friend std::ostream& operator<<(std::ostream& os, const std::vector<Shape>& shapes)
{
for (auto& shape : shapes)
{
os << shape.color_ << " " << shape.shape_ << " " << shape.size_ << "\n";
}
return os;
}
};
int main(int argc, char** argv)
{
std::vector<Shape> shapes;
shapes.emplace_back("Blue", "Circle", 1);
shapes.emplace_back("Red", "Triangle", 1);
shapes.emplace_back("Blue", "Circle", 3);
shapes.emplace_back("Red", "Triangle", 3);
shapes.emplace_back("Red", "Circle", 2);
shapes.emplace_back("Blue", "Triangle", 1);
shapes.emplace_back("Red", "Circle", 1);
shapes.emplace_back("Blue", "Triangle", 3);
shapes.emplace_back("Red", "Circle", 3);
shapes.emplace_back("Blue", "Circle", 2);
shapes.emplace_back("Blue", "Triangle", 2);
shapes.emplace_back("Red", "Triangle", 2);
std::cout << "Pre sorted vector:\n";
std::cout << shapes;
// std::sort by default will use the operator< for the types
// being sorted, if it's available
std::sort(shapes.begin(), shapes.end());
std::cout << "\nPost sorted vector:\n";
std::cout << shapes;
}
Это дает вывод:
Pre sorted vector:
Blue Circle 1
Red Triangle 1
Blue Circle 3
Red Triangle 3
Red Circle 2
Blue Triangle 1
Red Circle 1
Blue Triangle 3
Red Circle 3
Blue Circle 2
Blue Triangle 2
Red Triangle 2
Post sorted vector:
Blue Circle 1
Blue Circle 2
Blue Circle 3
Blue Triangle 1
Blue Triangle 2
Blue Triangle 3
Red Circle 1
Red Circle 2
Red Circle 3
Red Triangle 1
Red Triangle 2
Red Triangle 3