【发布时间】:2016-04-27 19:16:05
【问题描述】:
我有一个结构数组 (arrBoards),它有一些整数值、向量和字符串类型。 我想比较结构中的某个字符串是否与输入的参数(字符串 p1)相等。
什么想法更快 - 用数组中的每个字符串元素检查输入字符串的方程,或者首先检查数组的当前字符串元素中的 string.length() 是否大于 0,然后比较字符串。
if (p1.length())
{
transform(p1.begin(), p1.end(), p1.begin(), ::tolower); //to lowercase
for (int i=0; i<arrSize; i++) //check if string element already exists
if ( rdPtr->arrBoards[i].sName == p1 )
{
*/ some code */
break;
}
}
if (p1.length())
{
transform(p1.begin(), p1.end(), p1.begin(), ::tolower); //to lowercase
for (int i=0; i<arrSize; i++) //check if string element already exists
if ( rdPtr->arrBoards[i].sName.length() ) //check length of the string in the element of the array
if ( rdPtr->arrBoards[i].sName == p1 )
{
*/ some code */
break;
}
}
我认为第二个想法更好,因为它不需要每次都计算名称,但我可能会错,因为使用 if 会减慢代码速度。
感谢您的回答
【问题讨论】:
-
我很确定
sName == p1将首先进行长度检查(实际上是!empty()),因此您可能会将长度检查的次数加倍。我会对其进行分析,但我的猜测是不要'不要打扰长度检查 -
如果性能是一个问题,你最好看看不同的方法,比如哈希表,根据字符串对数组进行排序,...
-
Galik 的评论基本上就是它的归结。 您的 编译器/STL 实现是否这样做可能取决于您的特定平台/编译器等(尽管我希望任何现代实现都采用
!empty()快捷方式)。所以你最好自己做一些基准测试。 -
Galik 和 mindriot 的 cmets 都是有效的 - 但无论这样的基准测试结果如何,让它成为您设计决策的驱动因素可能仍然不是一个好主意:您的环境可能更改(不同的机器/操作系统/编译器/编译器版本/库版本),使所有以前的基准测试无用。而且,更高级别的设计替代方案可能会对整体性能产生更大的影响。
标签: c++ string performance