Как сопоставить массив символов с другим массивом символов? - PullRequest
3 голосов
/ 13 апреля 2019

Я пытаюсь сопоставить список символов другому, а затем соответствующим образом преобразовать строку.Чтобы сделать это, мне нужно добавить домен и диапазон для цели преобразования.

Я написал функцию с именем charConvert, и она проверяет входной символ, если это один из предопределенных символов, и если да, изменяетзначение, которое оно имеет с целевым значением.Он делает это через изнурительное число ifs, и я хочу сделать это с массивами (или более эффективными способами).

char charConvert (char b){
    if (b == 'a'){
        b = 'b';
        return b;
    }
    if (b == 'b'){
        b = 'c';
        return b;
    }
    if (b == 'c'){
        b = 'd';
        return b;
    }
    //....list goes like that
}

Есть ли более умное решение для такой проблемы отображения?

Ответы [ 3 ]

2 голосов
/ 13 апреля 2019

Да, индексирование в массив результатов - это самое быстрое, что вы можете получить. Он сводится к одной инструкции, которая считывает результат из памяти в архитектуре, подобной x86.

В частности, если вам не нужны все символы, как обычно, вы можете сместить на начальный, как показано здесь:

char charConvert(char b)
{
    static constexpr char mapping[] = {
        'x', // for 'a'
        'y', // for 'b'
        'z', // for 'c'
    };

    // Assuming ASCII (fine in most environments, but not guaranteed)
    return mapping[b - 'a'];
}

Рекомендуется добавить проверку вне пределов, по крайней мере, в режиме отладки.

0 голосов
/ 14 апреля 2019

Для простоты:

// Array of all possible letters:
int encode = [62];

// Adding to array:
encode['A'-'A'] = 'q';
encode['f'-'A'] = 'g';
// etc

// Pulling from array:
printf("%c\n", encode['f'-'A']);
0 голосов
/ 13 апреля 2019

Если все ваши символы однобайтовые char, то вы можете использовать 256-элементный static unsigned char [] в общем случае для сопоставления одного символа другому.

Этот подход используется, например, для функций Cкоторые принимают обратный комплемент последовательности ДНК.Ниже приведена таблица, которая сопоставляет нуклеотиды с их IUPAC-дополнением :

static unsigned char seq_comp_table[256] = {
      0,   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,  60,  61,  62,  63,
     64, 'T', 'V', 'G', 'H', 'E', 'F', 'C', 'D', 'I', 'J', 'M', 'L', 'K', 'N', 'O',
    'P', 'Q', 'Y', 'S', 'A', 'A', 'B', 'W', 'X', 'R', 'Z',  91,  92,  93,  94,  95,
     64, 't', 'v', 'g', 'h', 'e', 'f', 'c', 'd', 'i', 'j', 'm', 'l', 'k', 'n', 'o',
    'p', 'q', 'y', 's', 'a', 'a', 'b', 'w', 'x', 'r', 'z', 123, 124, 125, 126, 127,
    128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
    144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
    160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175,
    176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
    192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207,
    208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223,
    224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239,
    240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255
};

Чтобы получить основание (или «букву»), которое является дополнительным к основанию A, вам нужновызовите это:

unsigned char complementary_base = seq_comp_table[(uint8_t)'A']; /* T */

Если вы работаете с многобайтовыми символами, вы можете использовать std::map<wchar,wchar>.

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