从vector数组中获取unsigned int

时间:2016-01-28 20:52:53

标签: c++

是实现此代码的更好方法吗?

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;}

考虑丑陋的默认值。 如何使用迭代器和vector,deque,queue等模板实现此函数

注意:之前检查边界并且static_cast不是理想的选项。

2 个答案:

答案 0 :(得分:1)

最好返回一个unsigned int,这样在长度== 4的情况下你永远不会出现溢出。此外,vect[]vect.at()短。最后,您可以通过循环替换switch语句:

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;
}

答案 1 :(得分:0)

vectordeque都有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,因此您不需要在switch语句中使用default:行,即int destinyInt = -1