C++如何加快算法-使用字符串
C++ how to faster algorithm - working with strings
我正在制作一个使两个二进制数相加的程序。一切都很好,一切都正常,但我需要一些如何加快算法的技巧。
我正在考虑将所有变量更改为动态分配的变量。这是个好主意吗?使所有变量都是动态的,即使我只使用一个或只使用长字符串?
我需要关于如何使用动态分配变量的建议。
这是我的检查功能示例之一:
bool Correct(string v1, string v2){
for (unsigned int i = 0; i < v1.size(); ++i) {
if ((cin.fail())||((v1[i] != '1')&&(v1[i] != '0')))
return false;
}
for (unsigned int i = 0; i < v2.size(); ++i) {
if ((cin.fail())||((v2[i] != '1')&&(v2[i] != '0')))
return false;
}
return true;
}
当我使用这个:
bool JsouVstupySpravne(string *v1, string *v2){...}
所有像v1.size()这样的用法都停止工作。
您可以为开始提供输入参数的引用:
bool Correct(string v1, string v2){
可以是
bool Correct(const string &v1, const string &v2){
当使用指向字符串的指针而不是字符串时,需要更改
string1.size() → string1->size()
string1[x] → (*string1)[x]
因为C++需要的语法不同。
然而,C++也允许您使用"引用",以避免在保留字符串对象语法的情况下进行复制。要做到这一点,您可以更改:
bool Correct(string v1, string v2){ ... }
至
bool Correct(const string& v1, const string& v2){ ... }
然而,请注意,在今天的计算机中,执行速度取决于许多因素,因此在没有可靠度量的情况下"优化"代码简直是无稽之谈。您需要首先找到时间花在哪里(分析),然后再投资使代码更快(不幸的是,有时会使代码更丑)。
如果您正在寻找有关性能优化的建议,您需要发布负责大部分运行时的代码。你没有说你正在使用哪个操作系统,但应该有一个探查器可以告诉你这一点。在Linux上它是gprof,VC++包括一个。使用它可以找出时间花在哪里,然后优化热点。
最佳性能增益通常通过使用高效的算法来实现,然后对实现进行优化。如何将位字符串转换为数字?霍纳方案在我的脑海中是一种减少乘法运算的有效算法。
代码中有两点值得一提:
- 每次调用函数时都会复制字符串,但不会对其进行修改。使用常量引用
- 根据片段推测,您似乎使用std::cin将0/1字符转换为数字。这可能不是很有效,因为iostream做的事情在您的情况下可能不需要,例如区域设置处理
最后,如果您可以使用固定长度的二进制字符串和最大64位的大小,那么有一个std::bitset
类型可以实现您想要做的事情。
unsigned long long Correct(const string &v1, const string &v2){
auto const bits1 = std::bitset<64>( v1 );
auto const bits2 = std::bitset<64>( v2 );
return bits1.to_ullong() + bits2.to_ullong();
}
如果您需要更长的比特串,boost::dynamic_bitset
应该是一个替代方案。
相关文章:
- 高效的字符串截断算法,按顺序删除相等的前缀和后缀
- 如何使用 STL 算法将整数向量转换为字符串向量?
- 字符串::find在c++中使用了哪种算法
- 将来C++的标准库会包含网络、字符串算法,..吗?
- 如何将字符串保存在最长的常见子序列递归算法中
- 使用图形的字符串搜索算法?C++
- 重新定义要在字符串的 STL 算法中使用的<运算符
- 字符串相似性算法返回错误值
- "map"容器C++是否对字符串的连续子字符串应用 Rabin-Karp 算法?
- 如何实现将前缀与字符串匹配的最快算法
- 字符串算法分析的排列
- 检查字符串是否包含另一个字符串算法
- Boost字符串算法错误
- 使用带有绑定的boost字符串算法谓词
- 使用CString与boost字符串算法-减少到一个类型定义
- 在字符串算法中删除重复项
- 字符串算法boost:::::: finder.hpp
- 一次两个字符串算法
- cpp中的字符串算法
- 将boost字符串算法与迭代器结合使用