2016-01-28 2 views
-2

- лучший способ реализовать этот код?получить unsigned int из массива вектора

int getBlockVector(vector<unsigned char>& vect, const int pos, const int length) 
    { 
    int destinyInt = 0; 
    switch (length) { 
     case 1 : destinyInt = (0x00 << 24)    | (0x00 << 16)    | (0x00 << 8)    | vecct.at(pos); break; 
     case 2 : destinyInt = (0x00 << 24)    | (0x00 << 16)    | (vect.at(pos + 1) << 8) | vect.at(pos); break; 
     case 3 : destinyInt = (0x00 << 24)    | (vect.at(pos + 2) << 16) | (vect.at(pos + 1) << 8) | vect.at(pos); break; 
     case 4 : destinyInt = (vect.at(pos + 3) << 24) | (vect.at(pos + 2) << 16) | (vect.at(pos + 1) << 8) | vect.at(pos); break; 
     default : destinyInt = -1; 
return destinyInt;} 

с учетом уродливого значения по умолчанию. Как реализовать эту функцию с помощью итераторов и шаблонов для вектора, дека, очереди и т. Д.

Примечание: границы проверяются ранее, а static_cast не является желательной.

+0

Является ли это действительно необходимо побитовое ИЛИ с '0's? – LogicStuff

+1

@LogicStuff Ему платят за количество типизированных символов в программе. :) –

+0

@logicStuff не очень – Holister

ответ

1

Лучше вернуть неподписанный int, поэтому вы никогда не получите переполнение в случае длины == 4. Кроме того, vect[] короче vect.at(). Наконец, вы можете заменить оператор коммутатора петли:

unsigned int getBlockVector2(vector<unsigned char>& vect, const int pos, const int length) 
{ 
    unsigned int result = 0; 
    for (int k = 0; k < length; ++k) 
     result |= vect[k + pos] << (8 * k); 
    return result; 
} 
0

Оба vector и deque иметь at() функцию, так что вы можете использовать эти два контейнер с существующей функцией почти как есть, просто объявить его в качестве шаблона :

template <typename CONTAINER_T> 
int getBlockVector(CONTAINER_T& vect, const int pos, const int length) { 
    int destinyInt = 0; 
    switch (length) { 
     case 1 : destinyInt = (0x00 << 24)    | (0x00 << 16)    | (0x00 << 8)    | vect.at(pos); break; 
    /*etc...*/ 
} 

регулярное queue не поддерживает произвольный доступ или итераторы, так что вы не можете сделать эту функцию работать с queue. См. this thread для обходных решений и более подробное объяснение причин.

Вы также можете инициализировать destinyInt -1 при объявлении, поэтому вам не нужно default: строку в операторе переключателя, т.е. int destinyInt = -1