switch в C++

zrab

Знаю, что вопрос тупой, но инет сейчас вырублен, а разобраться надо. Оператор switch работает, если бы s1, s2, s3 были бы типа int, но почему-то не работает при типе string. В чем дело, скажите, плз. .
 
string s1 = "";
string s2 = "abcde";
string s3 = "edcba";
switch (s1)
{
case s2:
break;
case s2:
break;
case s2:
break;
default:
break;
}

И комп почему-то выдает ошибку. Что такое?

Werdna

во-первых, грамотнее писать std::string, как бы позорно писать так вот.
А во вторых ты хоть представляешь как case работает? Он на этапе компиляции занимается выстраиванием дерева из условных операторов. :)

slonishka

ну дерево — это сильно сказано. там же всего 1 левел в глубину.
типа вычислили выражение после switch и поехали сравнивать результат.
btw, ну и что, что дерево? что мешает сделать "дерево" для std::string?

mkrec

короче, так правильно. он и не должен работать.

slonishka

#include <stdio.h>

int main
{
double a = 3.2;

switch (a)
{
case 1.: printf("false\n"); break;
case 3.2: printf("true\n"); break;
default: printf("defau\n"); break;
}

return 0;
}

а вот тут что мешает сделать дерево? %)

zrab

Вопрос остается все-таки в силе. Как же мне сравнить эти несколько строчек с одной именно при помощи этого оператора?

slonishka

построй суффиксное дерево по тексту всех своих строк и сделай функцию my_switch,
которая реализует алгоритм поиска первого совпадения (или всех совпадений) с искомой подстрокой. :D
там за O(n) можно, как настоящий switch (правда n — число символов :crazy: ).
в соседнем треде была с числами немного похожая задача.

mkrec

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

kruzer25

но почему-то не работает при типе string
А в Си тип string - это строка, или указатель на первый из последовательности байт?
Если второе - ничего удивительного, что у тебя switch не работает...
И комп почему-то выдает ошибку.
Помогите! Я написал какую-то программу, что-то с ней сделал, и комп почему-то выдаёт какую-то ошибку! Что делать?

Werdna

а вот тут что мешает сделать дерево? %)
Помимо построения дерева switch ещё умеет делать массив из указателей по опр/ значениям, когда видит подряд идущие значения.
Короче, только целый может быть параметр, а в кейсах вообще переменных быть не должно.

zrab

Спасибо, и .
Всем остальным: блядь, ну и раздел. Задашь какой-нибудь вопрос, никто почти ничего конкретного не отвечет, зато почти всегда находятся люди, которые начинают общаться между собой хер знает на какую тему, поклав здоровенный баклажан на то, что спрашивали. Только, блядь, тред загаживают. Причем не только со мной. И нахуя так делать. Еще и острить пытаются вопросами в духе "ты вообще хоть знаешь, о чем говоришь" и т.д. и т.п. .

Vladislav177Rus

В C++ так сделать нельзя, хотя это и глупо (уповаем на C++09). Если очень надо, считай от строки хэш типа int.

kokoc88

А в Си тип string - это строка, или указатель на первый из последовательности байт?
А зачем отвечать в теме, в которой ты не разбираешься? :smirk: В Си++ тип std::string - это класс. А switch у нас работает только с целыми типами или с теми, у которых определён оператор преобразования.

vall

деревья сосут, хэш быстрее будет.

slonishka

на этот раз — да, зато у дерева больше фич! %)

vall

на практике почти всегда, если размер не слишком большой и порядок известен заранее.
если и про строки что-то известно то можно подобрать очень эффективный хэш.

yolki

потому что сравнивать два вещественных числа на равенство - по крайней мере неблагоразумно.

mkrec

можно вшить в процессор операцию "сравнить два вещественных числа на предмет равенства с точностью ε", где ε берется из какого-нибудь регистра

yolki

зачем нужен [math]$\varepsilon$[/math], если его разумное значение вычисляется из сравниваемых чисел?

mkrec

для продавца разумное ε одно, для метролога - другое

slonishka

всё равно крутизну деревьев нельзя отрицать! :D

Sanjaz

В стандарте сказанно:
6.4.2
  • 2 The condition shall beof integral type, enumeration type, or of a class type for whitch a single conversion function to integral or enumeration type exists.
...

slonishka

короче, про double — это был риторический вопрос. =)
Оставить комментарий
Имя или ник:
Комментарий: