关于在S-DES中更有效地实现扩展器功能的简单问题 ,我在C++中实现(简化)-DES,并且我有一个工作扩展函数。expander函数的定义是,给定一个6个条目的输入(比如,{1,2,3,4,5,6}),我们以如下形式输出一个新的8个条目的输出:{1,2,4,3,5,6}。我已经按如下方式实现了它,但我确信有更好的、可能更快的方法来实现它。有什么建议吗 void expandchars(std::vector<int> &vec){ std::vector<int> temp=vec; vec={temp[0],temp[1],temp[3],temp[2],temp[3],temp[2],temp[4],temp[5]}; } void expandchars(标准::向量和向量){ 标准::向量温度=向量; vec={temp[0],temp[1],temp[3],temp[2],temp[3],temp[2],temp[4],temp[5]}; }

关于在S-DES中更有效地实现扩展器功能的简单问题 ,我在C++中实现(简化)-DES,并且我有一个工作扩展函数。expander函数的定义是,给定一个6个条目的输入(比如,{1,2,3,4,5,6}),我们以如下形式输出一个新的8个条目的输出:{1,2,4,3,5,6}。我已经按如下方式实现了它,但我确信有更好的、可能更快的方法来实现它。有什么建议吗 void expandchars(std::vector<int> &vec){ std::vector<int> temp=vec; vec={temp[0],temp[1],temp[3],temp[2],temp[3],temp[2],temp[4],temp[5]}; } void expandchars(标准::向量和向量){ 标准::向量温度=向量; vec={temp[0],temp[1],temp[3],temp[2],temp[3],temp[2],temp[4],temp[5]}; },c++,cryptography,des,C++,Cryptography,Des,一种更快的方法是避免分配临时向量。如果向量容量()

一种更快的方法是避免分配临时向量。如果
向量容量()<8
则您的代码几乎是最佳的。要使其达到最佳状态,请执行以下操作:

void realloc_expandchars(std::vector<int> &vec){
  // Optimal if vec.capacity() <8, since a reallocation is unavoidable
  std::vector<int> temp=std::move(vec);
  vec={temp[0],temp[1],temp[3],temp[2],temp[3],temp[2],temp[4],temp[5]};
}
可能会稍微慢一点,但更可读的是使用std::array:

void inplace_expandchars(std::vector<int> &vec){
    std::array<int, 8> temp = {vec[0], vec[1], vec[3], vec[2], vec[3], vec[2], vec[4], vec[5]}; 
    vec.clear();
    vec.insert(vec.begin(), temp.begin(), temp.end());
}
void in place\u expandchars(标准::向量和向量){
数组temp={vec[0],vec[1],vec[3],vec[2],vec[3],vec[2],vec[4],vec[5]};
向量清除();
向量插入(向量开始(),临时开始(),临时结束());
}
然后将它们结合起来:

   void expandchars(std::vector<int> &vec){
     if (vec.capacity() < 8)
         realloc_expandchars(vec);
     else
         inplace_expandchars(vec);
   }
void expandchars(标准::向量和向量){
如果(向量容量()<8)
realloc_expandchars(vec);
其他的
就地扩容器(vec);
}

因此,如果我理解第一个INSITE扩展码,它是这样的:首先,我们在第四,第五个位置插入两个0,所以我们将从{1,2,3,4,5,6}到{1,2,3,4,0,0,5,6},然后将{3,4,0,0}替换为{4,3,4,3},如果{{,1,2,4},(3,4,3,5,6}),我可以理解为正确的,我对C++的东西很新,用于Mathematica/Matlab。(:@Shinaolord我还没有运行它,但你的想法是正确的。
   void expandchars(std::vector<int> &vec){
     if (vec.capacity() < 8)
         realloc_expandchars(vec);
     else
         inplace_expandchars(vec);
   }