Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
 Аватар для Wiiiiijjj
19 / 19 / 18
Регистрация: 25.08.2014
Сообщений: 186

Switch со строками и переопределение вектора

18.09.2014, 11:59. Показов 3569. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня несколько вопросов по вот такому коду:

1. arr — глобальная переменная vector<int>.
1.1. Почему нельзя переобъявить как arr = new vector<int>?
1.2 Будет ли работать vector<int> arr повторно? (он как минимум компилится)
2. Как можно упростить эту конструкцию? Можно ли, например, использовать switch?

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
        cin >> arrtype;
 
        if (arrtype == "int")
            vector<int> arr;
 
        else if (arrtype == "float")
            vector<float> arr;
 
        else if (arrtype == "double")
            vector<double> arr;
 
        else if (arrtype == "char")
            vector<char> arr;
 
        else if (arrtype == "string")
            vector<string> arr;
 
        else if (arrtype == "bool")
            vector<bool> arr;
 
        else correct = false;
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.09.2014, 11:59
Ответы с готовыми решениями:

Переопределение операций со строками
Операция переопределения Замена в строке первых n символов на символ с наименьшим кодом из входящих в строку почему-то работает...

Оператор switch со строками
здравствуйте,как написать оператор выбора для string? команда std::string t; switch(t) { } не работает

Оператор switch не работает со строками
switch(DBGrid1-&gt;DataSource-&gt;DataSet-&gt;FieldByName(&quot;Äèàãíîç&quot;)-&gt;AsString){ case...

10
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2224 / 1426 / 420
Регистрация: 16.05.2013
Сообщений: 3,646
Записей в блоге: 6
18.09.2014, 12:09
Цитата Сообщение от Wiiiiijjj Посмотреть сообщение
1.1. Почему нельзя переобъявить как arr = new vector<int>?
Потому как вектор сам управляет динамическим выделением памяти.
Цитата Сообщение от Wiiiiijjj Посмотреть сообщение
Можно ли, например, использовать switch?
Нельзя объявлять переменные в switch
Подробнее опишите суть проблемы.
1
 Аватар для Wiiiiijjj
19 / 19 / 18
Регистрация: 25.08.2014
Сообщений: 186
18.09.2014, 12:10  [ТС]
Да, еще вопрос: к примеру, у меня есть командная строка в программе, и для каждой возможной команды есть функция. Как проще всего реализовать считывание команды и вызов этих функций?
0
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2224 / 1426 / 420
Регистрация: 16.05.2013
Сообщений: 3,646
Записей в блоге: 6
18.09.2014, 12:16
Цитата Сообщение от Wiiiiijjj Посмотреть сообщение
Да, еще вопрос: к примеру, у меня есть командная строка в программе, и для каждой возможной команды есть функция. Как проще всего реализовать считывание команды и вызов этих функций?
Как вариант использовать отображение с ключами ввиде строк и значениями ввиде указателей на функции.
1
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
18.09.2014, 12:28
1.1. Почему нельзя переобъявить как arr = new vector<int>?
Потому что если код будет допускать смену типа переменной (с vector<int> на vector<int>*) на стадии исполнения, его придется исполнять не на процессоре, а на виртуальной машине. Со всеми вытекающими тормозами. В принципе тоже метод программирования, но C++ на него не рассчитан.
2. Как можно упростить эту конструкцию? Можно ли, например, использовать switch?
Никак. То есть сам по себе универсальный вектор при желании сделать можно, но только после долгих плясок с бубном вокруг абстрактных классов с перегруженными виртуальными операторами.
1
 Аватар для Wiiiiijjj
19 / 19 / 18
Регистрация: 25.08.2014
Сообщений: 186
18.09.2014, 12:48  [ТС]
Цитата Сообщение от Ilot Посмотреть сообщение
отображение с ключами ввиде строк и значениями ввиде указателей на функции
Нагуглилось что-то про map, контейнер с ключом и данными. Вроде бы суть понятна, но как сделать я не представляю
0
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2224 / 1426 / 420
Регистрация: 16.05.2013
Сообщений: 3,646
Записей в блоге: 6
18.09.2014, 13:04
Лучший ответ Сообщение было отмечено Wiiiiijjj как решение

Решение

Пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <map>
#include <string>
void func_1() {
    std::cout << "func_1" << std::endl;
}
void func_2() {
    std::cout << "func_2" << std::endl;
}
typedef void (*func) ();
int main(int argc, char** argv) {
    std::map<std::string, func> coll;
    coll["1"] = &func_1;
    coll["2"] = &func_2;
    func f_interpret;
    f_interpret = coll[argv[1]];
    f_interpret();
    system("pause");
    return 0;
}
Только будьте аккуратнее с обработкой командной строки.
1
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
18.09.2014, 13:04
Цитата Сообщение от Wiiiiijjj Посмотреть сообщение
Вроде бы суть понятна, но как сделать я не представляю
Сформулируйте решаемую прикладную задачу. Код из первого поста сам по себе не имеет смысла.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
18.09.2014, 14:00
Wiiiiijjj, в С++11 switch по заранее известным строкам сделать несложно:
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
#include <string>
 
constexpr size_t ct_hash_suffix(char c, size_t seed)
{
    return static_cast<size_t>(c) + 0x9e3779b9ul + (seed << 6) + (seed >> 2);
}
 
size_t hash_value(std::string const & str)
{
    size_t seed = 0;
    for(char c : str)
    {
        seed ^= ct_hash_suffix(c, seed);
    }
    return seed;
}
 
constexpr size_t ct_hash(char const * str, size_t seed = 0)
{
    return *str ? ct_hash(str + 1, seed ^ ct_hash_suffix(*str, seed)) : seed;
}
 
int main()
{
    std::string arrtype;
    std::cin >> arrtype;
 
    bool correct = true;
 
    switch(hash_value(arrtype))
    {
    case ct_hash("int"):
        break;
    case ct_hash("float"):
        break;
    case ct_hash("double"):
        break;
    case ct_hash("char"):
        break;
    case ct_hash("string"):
        break;
    case ct_hash("bool"):
        break;
    default:
        correct = false;
    }
}
А вариантный вектор можно сделать, например, на основе boost::variant. Но без четко сформулированной задачи, действительно, пока рано что-то советовать.
3
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
18.09.2014, 14:20
Wiiiiijjj, в С++11 switch по заранее известным строкам сделать несложно:
switch по хешам и switch по строкам - две абсолютно разные вещи (потому что коллизии).
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
18.09.2014, 15:04
Цитата Сообщение от Renji Посмотреть сообщение
switch по хешам и switch по строкам - две абсолютно разные вещи (потому что коллизии).
О каких коллизиях может идти речь в случае, когда строк 5-6 штук и все они известны на этапе компиляции (я же написал про заранее известные строки именно для того, чтобы предупредить этот комментарий, но все равно почему-то получил его)? Да и все зависит от качества хэш-функции в конечном итоге.
К тому же, учитывая, что switch по строкам в С++ невозможен, то это просто маленькая вариация на тему, а не претензия на серебряную пулю, как ты, возможно, подумал.

Не по теме:


PS. Очень хотелось бы, чтобы ты цитировал правильно сообщения (с указанием автора), иначе твое обращение может быть никогда не услышано (потому что не приходит оповещение).

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.09.2014, 15:04
Помогаю со студенческими работами здесь

Как использовать оператор switch со строками?
Добрый день! Подскажите пожалуйста как использовать оператор switch с объектом String? Я понимаю что switch работает только с...

Инициализация вектора строками string
В книжке Страус'а можно инициализировать вектор string'ами. У меня не получается. Я дурак или он?

Оптимизируется ли компилятором конструкция switch-case? Работа со строками через ID объекта или hash
Добрый вечер, 1) Определён ли порядок выбора switch (согласно стандарта кажись неопределён, но все компиляторы я уверен в этом...

Найти выражение для: вектора скорости; вектора ускорения; модуля радиус-вектора
Товарищи, помогите пожалуйста решить. Радиус-вектор материальной точки задается выражением: r=(t^2+2)i+(3t^2+4)j Найти...

Как сделать чтобы Switch работал в другом Switch'e?
Как сделать что бы Switch работал в другом Switch'e? Вот допустим выбираем один пункт и в зависимости от выбранного нами пункта последующие...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
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