Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
1 / 1 / 2
Регистрация: 23.01.2013
Сообщений: 113

Сортировка вектора структур по совпадению string

29.08.2019, 01:42. Показов 1555. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В игре я хочу написать некое подобие ajax формы поиска как на сайтах, но сортируя вектор. Допустим человек вводит
2-3 буквы, я нахожу совпадения и перемещаю их в начало.


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
struct TES
{
    int num, price, status;
    string mdlname;
};
vector<TES> cpricesort;
 
void compareByName()
{
    adadd = 0;
    string texxt = ws2s(keyPresses);
    vector<TES> tmp;
    
    for (auto &cr : cpricesort)
    {
        if (texxt.size() >= 2 && cr.mdlname.find(texxt.c_str()) != string::npos)
        {           
            Print("found %d %s \n", cr.num, cr.mdlname.c_str());
            swap(cpricesort[cr.mdl], cpricesort[adadd]);  
            adadd++;            
        }       
    }
}
Вывод Print откуда куда сортировать - правильный, например (keyPresses = "wp")

Code
1
2
3
4
5
6
7
8
9
10
11
 5 v_awp 0
 18 v_awp 1
 25 v_awp 2
 28 v_awp 3
 40 v_awp 4
[B] 5 v_awp 5[/B] непонятный дубль.
 45 v_awp 6
 56 v_awp 7
 64 v_awp 8
 73 v_awp 9
79 v_awp 10
несмотря на дубль, находит правильно .
В реальности после swap вектор выглядит
вот так


after 6 v_m4a1
after 19 v_famas
after 26 v_famas
after 29 v_deagle
after 41 v_p228
after 1 v_knife
after 46 v_knife
after 57 v_usp
after 65 v_glock18
after 74 v_sg550
after 80 v_glock18
after 12 v_m4a1
after 13 v_m4a1
after 14 v_xm1014
after 15 v_m4a1
after 16 v_ump45
after 17 v_galil
after 18 v_awp
after 2 v_knife
after 20 v_m4a1
after 21 v_deagle
after 22 v_usp
after 23 v_m3
after 24 v_fiveseven
after 25 v_awp
after 3 v_glock18
after 27 v_knife
after 28 v_awp
after 4 v_ak47
after 30 v_deagle
after 31 v_usp
after 32 v_knife
after 33 v_m4a1
after 34 v_m4a1
after 35 v_m4a1
after 36 v_deagle
after 37 v_knife
after 38 v_knife
after 39 v_knife
after 40 v_awp
after 5 v_awp
after 42 v_deagle
after 43 v_deagle
after 44 v_knife
after 45 v_awp
after 7 v_p228
after 47 v_deagle
after 48 v_knife
after 49 v_ak47
after 50 v_p90
after 51 v_knife
after 52 v_deagle
after 53 v_deagle
after 54 v_usp
after 55 v_m4a1
after 56 v_awp
after 8 v_p90
after 58 v_ak47
after 59 v_mac10
after 60 v_ump45
after 61 v_p90
after 62 v_deagle
after 63 v_knife
after 64 v_awp
after 9 v_knife
after 66 v_ak47
after 67 v_deagle
after 68 v_ak47
after 69 v_m4a1
after 70 v_p90
after 71 v_m4a1
after 72 v_knife
after 73 v_awp
after 10 v_m4a1
after 75 v_usp
after 76 v_glock18
after 77 v_m4a1
after 78 v_glock18
after 79 v_awp
after 11 v_m4a1
after 81 v_deagle
after 82 v_deagle
after 83 v_sg550
after 84 v_m4a1
after 85 v_ak47
after 86 v_ak47
after 87 v_sg550
after 88 v_famas
after 89 v_usp


Не могу разрулить, в чем косяк. Может оно меняет лишние разы ячейки.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.08.2019, 01:42
Ответы с готовыми решениями:

Сортировка вектора структур
Привет всем! Почему это не сортируется? Или как это правильно отсортировать? #include &lt;iostream&gt; #include &lt;vector&gt; ...

Сортировка вектора структур
Всем привет. При написании программы наткнулся на проблему: имею вектор структур, который нужно отсортировать(сортировкой Шелла) по...

Сортировка вектора структур за алфавитом
Разработать программу , которая выделяет все слова, встречающиеся в текстовом файле , вычисляет количество вхождений каждого слова . ...

6
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
29.08.2019, 09:01
Цитата Сообщение от csp Посмотреть сообщение
Не могу разрулить, в чем косяк. Может оно меняет лишние разы ячейки.
Думаю косяк в том, что здесь не swap надо делать, а перемещать ячейку - удалять из старой позиции и вставлять в начало
0
 Аватар для SomniPhobia
602 / 439 / 137
Регистрация: 22.11.2017
Сообщений: 1,407
29.08.2019, 11:31
csp, привет!
Цитата Сообщение от csp Посмотреть сообщение
человек вводит
2-3 буквы, я нахожу совпадения и перемещаю их в начало
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <iostream>
#include <vector>
#include <string>
#include <optional>
#include <algorithm>
#include <numeric>
#include <iterator>
 
struct TES
{
    int num, price, status;
    std::string mdlname;
};
 
std::vector<TES>::iterator compareByName(std::vector<TES>& box, const std::string& find_text)
{
    std::vector<TES>::iterator terminator = std::end(box);
    if (find_text.length() >= 2)
    {
        auto predicate_good = [find_text](const TES& t)
        {
            return t.mdlname.find(find_text) != std::string::npos;
        };
        //Если нужно сохранить исходный порядок следования элементов
        terminator = std::stable_partition(std::begin(box), std::end(box), predicate_good);
        //Если необязательно сохранять исходный порядок следования элементов
        //terminator = std::partition(std::begin(box), std::end(box), predicate_good);
    }
    return terminator;
}
 
int main()
{   
    std::vector<TES> cpricesort
    {
        {5, 0, 0, "v_awp"},
        {5, 0, 0, "v_amp"},
        {18, 0, 0, "v_awp1"},
        {25, 0, 0, "v_awp2"},
        {16, 0, 0, "v_amk6"},
        {15, 0, 0, "v_amt6"},
        {40, 0, 0, "v_amp4"},
        {50, 0, 0, "v_owp5"},
        {70, 0, 0, "v_opw5"},
        {80, 0, 0, "v_ywp40"},
        {90, 0, 0, "v_kwp5"}
    };
    const std::string find_text("wp");
    std::vector<TES>::iterator terminator = compareByName(cpricesort, find_text);
 
    for (auto it = std::begin(cpricesort); it != std::end(cpricesort); ++it)
    {
        if (it == terminator)
            std::cout << "+++++++\n";
        std::cout << (*it).num << " " << (*it).mdlname << "\n";
    }
 
    return 0;
}
Миниатюры
Сортировка вектора структур по совпадению string  
0
1 / 1 / 2
Регистрация: 23.01.2013
Сообщений: 113
29.08.2019, 13:08  [ТС]
забыл сказать проект в Vs 2015, там нет #include <optional>
но я понял что вы сделали кастомный итератор, у меня swap(cpricesort.back(), cpricesort.front()); такое работает, попробую как то переделать.
0
 Аватар для SomniPhobia
602 / 439 / 137
Регистрация: 22.11.2017
Сообщений: 1,407
29.08.2019, 14:59
optional это из C++17.
csp, вообще то, я забыл отключить библиотеки от предыдущего (другого) проекта: optional, numeric, iterator не нужны здесь. Удали их include. У меня Visual Studio 2019.
Цитата Сообщение от csp Посмотреть сообщение
вы сделали кастомный итератор
Нет. Я использовал STL функцию (кстати swap это тоже STL функция) std::stable_partition, которая перемещает в начало контейнера элементы удовлетворяющие предикату (predicate_good), не удовлетворяющие предикату элементы остаются в задней части контейнера. Функция std::stable_partition возвращает итератор на первый элемент в контейнере, не удовлетворяющий предикату. Этот итератор не кастомный.
Затем, используя этот итератор ставим разграничитель: до +++++++ идут элементы контейнера удовлетворяющие предикату, а после (ниже) плюсов размещаются элементы не удовлетворяющие предикату.

Добавлено через 3 минуты
Цитата Сообщение от csp Посмотреть сообщение
у меня swap(cpricesort.back(), cpricesort.front()); такое работает, попробую как то переделать
Чем тебе мой код не нравится?
1
1 / 1 / 2
Регистрация: 23.01.2013
Сообщений: 113
29.08.2019, 16:46  [ТС]
Решил, и решение было проще, нумерация 1-2-3 но в векторе 0-1-2
поэтому

C++
1
2
3
не        swap(cpricesort[cr.mdl], cpricesort[adadd]);
 
а          swap(cpricesort[cr.mdl-1], cpricesort[adadd]);
0
 Аватар для SomniPhobia
602 / 439 / 137
Регистрация: 22.11.2017
Сообщений: 1,407
30.08.2019, 10:49
csp, вот попроще код. Итератор terminator не обязателен. Подумай, зачем он нужен в предыдущем моём коде.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
 
struct TES
{
    int num, price, status;
    std::string mdlname;
};
 
void compareByName(std::vector<TES>& box, const std::string& find_text)
{
    if (find_text.length() >= 2)
        std::stable_partition(std::begin(box), std::end(box),
        [find_text](const TES& t) { return t.mdlname.find(find_text) != std::string::npos; });
}
 
int main()
{
    std::vector<TES> cpricesort
    {
        {5, 0, 0, "v_awp"},
        {5, 0, 0, "v_amp"},
        {18, 0, 0, "v_awp1"},
        {25, 0, 0, "v_awp2"},
        {16, 0, 0, "v_amk6"},
        {15, 0, 0, "v_amt6"},
        {40, 0, 0, "v_amp4"},
        {50, 0, 0, "v_owp5"},
        {70, 0, 0, "v_opw5"},
        {80, 0, 0, "v_ywp40"},
        {90, 0, 0, "v_kwp5"}
    };
    compareByName(cpricesort, "wp");
 
    for (const auto& t : cpricesort)
        std::cout << t.num << " " << t.mdlname << "\n";
 
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.08.2019, 10:49
Помогаю со студенческими работами здесь

Сортировка массива(вектора)структур по одному полю
Код:#include &lt;iostream&gt; #include &lt;sstream&gt; #include &lt;vector&gt; #include &lt;algorithm&gt; struct Person{ std::string surname,name; ...

Сортировка массива (вектора) структур по заданному полю
Нужно отсортировать массив по полю структуры. Все поля типа string. struct DatabaseData{ std::string aPointOfDeparture;//Пункт...

Сортировка вектора string
Всем привет Есть вектор типа string vector &lt;string&gt; str; Допустим в нем такие строки : str = &quot;100&quot;; str = &quot;1&quot;; ...

Блочная сортировка структур (Отсортировать массив структур по фамилии)
Подскажите алгоритм блочной сортировки структур на языке С++. Мне нужно отсортировать массив структур по фамилии.

Сортировка вектора структур
Подскажите, пожалуйста, как отсортировать вектор из структур по одному из полей с помощью функции sort? struct AutoCars { string...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru