1 / 1 / 2
Регистрация: 23.01.2013
Сообщений: 113
1

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

29.08.2019, 01:42. Показов 837. Ответов 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")

Код
 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

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.08.2019, 01:42
Ответы с готовыми решениями:

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

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

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

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

6
6737 / 4537 / 1838
Регистрация: 07.05.2019
Сообщений: 13,725
Записей в блоге: 1
29.08.2019, 09:01 2
Цитата Сообщение от csp Посмотреть сообщение
Не могу разрулить, в чем косяк. Может оно меняет лишние разы ячейки.
Думаю косяк в том, что здесь не swap надо делать, а перемещать ячейку - удалять из старой позиции и вставлять в начало
0
567 / 406 / 132
Регистрация: 22.11.2017
Сообщений: 1,046
29.08.2019, 11:31 3
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;
}
0
Миниатюры
Сортировка вектора структур по совпадению string  
1 / 1 / 2
Регистрация: 23.01.2013
Сообщений: 113
29.08.2019, 13:08  [ТС] 4
забыл сказать проект в Vs 2015, там нет #include <optional>
но я понял что вы сделали кастомный итератор, у меня swap(cpricesort.back(), cpricesort.front()); такое работает, попробую как то переделать.
0
567 / 406 / 132
Регистрация: 22.11.2017
Сообщений: 1,046
29.08.2019, 14:59 5
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  [ТС] 6
Решил, и решение было проще, нумерация 1-2-3 но в векторе 0-1-2
поэтому

C++
1
2
3
не        swap(cpricesort[cr.mdl], cpricesort[adadd]);
 
а          swap(cpricesort[cr.mdl-1], cpricesort[adadd]);
0
567 / 406 / 132
Регистрация: 22.11.2017
Сообщений: 1,046
30.08.2019, 10:49 7
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.08.2019, 10:49

Помощь в написании контрольных, курсовых и дипломных работ здесь.

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.