关于在 S-DES 中实现扩展函数的更有效方法的简单问题
Simple question about a more efficient way to implement Expander Function in S-DES
所以,我正在用 C++ 实现(简化的)-DES,并且我有一个有效的 Expander 函数。扩展函数定义为,给定一个 6 条目输入(比如 {1,2,3,4,5,6},我们输出一个新的 8 条目输出,形式如下:{1,2,4,3 ,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]};
}
更快的方法是避免分配临时向量。如果 vec.capacity() < 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]};
}
如果 vec.capacity() >= 8
那么您可能希望避免创建新向量。为此,您可能需要执行以下操作:
void inplace_expandchars(std::vector<int> &vec){
vec.insert(vec.begin() + 4, 2 /*count*/, 0 /* value */);
vec[4] = vec[3];
vec[5] = vec[2];
vec[2] = vec[4];
vec[3] = vec[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 expandchars(std::vector<int> &vec){
if (vec.capacity() < 8)
realloc_expandchars(vec);
else
inplace_expandchars(vec);
}
所以,我正在用 C++ 实现(简化的)-DES,并且我有一个有效的 Expander 函数。扩展函数定义为,给定一个 6 条目输入(比如 {1,2,3,4,5,6},我们输出一个新的 8 条目输出,形式如下:{1,2,4,3 ,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]};
}
更快的方法是避免分配临时向量。如果 vec.capacity() < 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]};
}
如果 vec.capacity() >= 8
那么您可能希望避免创建新向量。为此,您可能需要执行以下操作:
void inplace_expandchars(std::vector<int> &vec){
vec.insert(vec.begin() + 4, 2 /*count*/, 0 /* value */);
vec[4] = vec[3];
vec[5] = vec[2];
vec[2] = vec[4];
vec[3] = vec[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 expandchars(std::vector<int> &vec){
if (vec.capacity() < 8)
realloc_expandchars(vec);
else
inplace_expandchars(vec);
}