是实现此代码的更好方法吗?
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不是理想的选项。
答案 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)
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,因此您不需要在switch语句中使用default:
行,即int destinyInt = -1