Вопрос Сортировка 2х векторов одновременно. в c++.

Регистрация
10 Сен 2013
Сообщения
88
Репутация
1
Спасибо
0
Монет
0
Я не знаю как это сделать.

К примеру есть вектора n(имя) и k(код).

n[0]="Рорик" k[0]="98"

n[1]="Андрей" k[1]="112"

n[2]="Ярослав" k[2]="17"

Как сделать сортировку по имени, что бы значение вектора изменились на:

n[0]="Андрей" k[0]="112"

n[1]="Рорик" k[1]="98"

n[2]="Ярослав" k[2]="17"

Или по коды(от меньше к большему):

n[0]="Ярослав" k[0]="17"

n[1]="Рорик" k[1]="98"

n[2]="Андрей" k[2]="112"
 
Как уже написал выше Николай Веселуха, надо, в первую очередь, использовать правильную структуру данных.
Запись в базе данных - это некая совокупность полей, описывающих какую-то сущность. Использовать для хранения этих полей разные вектора - очень хреновая идея. Гораздо лучше засунуть их в один класс или одну структуру и хранить коллекцию из этих классов/структур.
Сортировать записи в базе тоже не самая лучшая идея. Да, если у нас всего два поля (имя и код), то накладные расходы будут не очень высокими, но концептуально это все равно неправильно. По хорошему, для организации доступа в каком-либо порядке используют ИНДЕКСЫ (это не те индексы, что определяют положение в массиве, это структура данных в базе данных, которая отсортирована по одному или нескольким полям и связывает запись в индексе с записью в базе). Т.е., допустим, у нас есть запись вида struct Record
{
std::string name,
std::string code;
} а вся база - это std::vector database; Чтобы получить отсортированные по какому-то из полей данные можно, например использовать индекс вида std::map name_idx;
std::map code_idx; где std::string - это имя или код из записи а size_t - это индекс записи в векторе database
 
Нужно выбрать правильную структуру данных! #include
#include
#include
using namespace std;
int main() {
multimap ascending{
{"Рюрик", 98},
{"Андрей", 112},
{"Ярослав", 17}
};
multimap descending{
ascending.crbegin(),
ascending.crend()
};
for (const auto& [name, code] : ascending) {
cout
 
Для одновременной сортировки двух векторов в C++ можно использовать алгоритм std::sort вместе с лямбда-функцией. Вот пример кода, который демонстрирует сортировку по имени и по коду:


#include
#include
#include
#include

int main() {
std::vector names{"Рорик", "Андрей", "Ярослав"};
std::vector codes{"98", "112", "17"};

// Сортировка по имени
std::sort(names.begin(), names.end(),
[&](const std::string& a, const std::string& b) {
int index_a = std::find(names.begin(), names.end(), a) - names.begin();
int index_b = std::find(names.begin(), names.end(), b) - names.begin();
return index_a < index_b;
});

std::cout
 
#include
#include
#include
#include

// Компаратор для сортировки по именам
bool compareByName(const std::pair& a, const std::pair& b) {
return a.first < b.first;
}

int main() {
std::vector n = {"Рорик", "Андрей", "Ярослав"};
std::vector k = {"98", "112", "17"};

// Создаем вектор пар (имя, код)
std::vector pairs;
for (int i = 0; i < n.size(); i++) {
pairs.emplace_back(n, k);
}

// Сортируем вектор пар по именам
std::sort(pairs.begin(), pairs.end(), compareByName);

// Обновляем векторы n и k после сортировки
for (int i = 0; i < pairs.size(); i++) {
n = pairs.first;
k = pairs.second;
}

// Выводим отсортированные векторы
std::cout
 
Назад
Сверху