Вам необходимо создать функцию сравнения, которая возвращает правильный порядок и передает его в std::sort
.Для этого вы можете написать многократно используемую функцию, которая возвращает лямбду, которая сравнивает результат попытки с std::find
двумя сравниваемыми элементами.std::find
возвращает итераторы, и вы можете сравнить их с оператором <
.
#include <algorithm>
std::vector<std::string> correctOrder = {"Item1", "Item2", "Item3", "Item4", "Item5"};
// Could be just std::string correctOrder[], or std::array<...> etc.
// Returns a sorter that orders elements based on the order given by the iterator pair
// (so it supports not just std::vector<string> but other containers too.
template <typename ReferenceIter>
auto ordered_sorter(ReferenceIter ref_begin, ReferenceIter ref_end) {
// Note: you can build an std::unordered_map<ReferenceIter::value_type, std::size_t> to
// be more efficient and compare map.find(left)->second with
// map.find(right)->second (after you make sure the find does not return a
// one-past-the-end iterator.
return [&](const auto& left, const auto& right) {
return std::find(ref_begin, ref_end, left) < std::find(ref_begin, ref_end, right);
};
}
int main() {
using namespace std;
vector<string> v{"Item3", "Item5", "Item1"};
// Pass the ordered_sorter to std::sort
std::sort(v.begin(), v.end(), ordered_sorter(std::begin(correctOrder), std::end(correctOrder)));
for (const auto& s : v)
std::cout << s << ", "; // "Item1, Item3, Item5, "
}
Обратите внимание, что этот ответ менее эффективен при большом количестве элементов, но более прост, чем решения, использующие std::unordered_map<std::string, int>
для поиска, но линейный поиск, вероятно, быстрее для небольшого числа элементов.Проведите сравнительный анализ, если производительность имеет значение.