В настоящее время я делаю проект, в котором мне нужно создать две структуры данных, которые будут использоваться для хранения строк. Один из них должен быть формой связанного списка, и мне было предложено разделить слова в отдельные списки внутри него для каждой буквы алфавита. Мне нужно подумать об эффективности, поэтому у меня есть массив указателей Head размером 26, и я хочу преобразовать первый символ данного слова в целое число, чтобы я мог поместить его в индекс, например:
//a string called s is passed as a parameter to the function
int i = /*some magic happens here*/ s.substr(0, 1);
currentPointer = heads[i]; //then I start iterating through the list
Я искал вокруг, и все, что я, кажется, нашел, это как преобразовать числовые символы в строках в целые числа, а не буквенные символы, и мне интересно, как же я могу заставить это работать, не прибегая к огромным и безобразный набор операторов if
Когда вы устанавливаете i в значение первого символа, вы получаете значение ASCII.
Так что я вне вашего диапазона 0-25: см. Человек ASCII
Вы можете уменьшить его путем вычитания первой буквы alaphabet ascii. (Будьте осторожны с делом)
std::string s("zoro");
int i = s[0];
std::cout << "Ascii value : " << i << " Reduced : " << i - 'a' << std::endl;
Которые дают значение ASCII ‘z’ = 112 и 25 для уменьшенного значения, как и ожидалось.
Я думаю, что вы путаете ценности с представлениями. «Десять», «10» и «1 1 1 1 1 1 1 1 1 1» — все это одно и то же значение, просто представленное по-разному.
Я искал вокруг, и все, что я, кажется, нашел, это как преобразовать числовые символы в строках в целые числа, а не буквенные символы
Там нет разницы. В любом случае символы всегда представлены целыми числами. Это просто вопрос представительства. Просто представьте значение так, как вы хотите.
Кстати, это ключевая концепция, которую программисты должны понимать. Так что стоит подумать об этом.
Классическим примером этого недоразумения является вопрос типа «У меня есть переменная i
это имеет некоторое значение в десятичном виде. Как я могу сделать так, чтобы оно хранило значение в шестнадцатеричном формате? ценности и шестнадцатеричные и десятичные представления. Если у вас есть десять машин, у вас есть десять в машины, не в десятичном или шестнадцатеричном виде. Если i
имеет значение десять, то значение десять в i
, а не представление десяти в десятичном или шестнадцатеричном виде.
Конечно, когда ты дисплей значение Хранится в i
, вы должны выбрать, как представлять Это. Вы можете отобразить это как ten
, или же 10
, | | | | | | | | | | |
или что угодно.
И у вас может быть строка, которая имеет представление из значение «десять» в шестнадцатеричном, и вам может потребоваться назначить значение к переменной. Это требует преобразования из представления в значение, которое оно представляет.
Есть функции ввода и вывода, которые вводят и выводят ценности в различных представления.
Я подозреваю, что вы хотите преобразовать цифры, хранящиеся в строках, как символы в целые числа, например персонаж '9'
целое число 9
,
Для этого:
char c = '9';
int x = c - '0';
Это будет работать независимо от того, есть ли у вас компьютер, использующий ASCII или EBCDIC …
В этом случае вам, кажется, не нужно atoi
или же itoa
(ни один не собирается делать что-то очень полезное с, например, J
). Вы просто хотите что-то вроде:
int i = tolower(s[0])-'a';
Теоретически это не переносимо — если есть вероятность использования кода на машине, которая использует EBCDIC (то есть, IBM или совместимый мэйнфрейм), вы захотите использовать что-то вроде 'z'-'a'
как размер вашего массива, поскольку он не будет ровно 26 (EBCDIC включает в себя некоторые другие символы, вставленные между некоторыми буквами, поэтому буквы расположены по порядку, но не смежно).
Возможно, что еще более важно, если вы хотите поддерживать языки, отличные от английского, все меняется совсем в спешке — у вас может быть другое количество букв, чем у 26, они могут не все быть смежными и т. Д. Для такого случая ваш основной дизайн действительно проблема. Вместо того, чтобы исправлять эту одну строку кода, вам, вероятно, придется перепроектировать почти полностью.
Тем не менее, есть неплохой шанс, что связанный список не очень хороший выбор.