我有一个struct(arrBoards)数组,它有一些整数值,vector和一个字符串类型。 我想比较结构中的某个字符串是否与输入的参数(字符串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会减慢代码。
感谢您的回答
答案 0 :(得分:5)
我确定字符串类的比较运算符(==)已经足够优化了。只是使用它。
operator ==(...)根据短路比较返回一个bool
public function index()
{
if (!$this->ion_auth->logged_in())
{
redirect('account/sign_in', 'refresh');
}
elseif ($this->ion_auth->is_admin())
{
$this->template->administrator('dashboard/dashboard');
//View to Administrator
}
elseif($this->ion_auth->in_group('admin'))
{
$this->template->admin('dashboard/dashboard');
//View to Admin
}
elseif($this->ion_auth->in_group('user'))
{
$this->template->user('dashboard/dashboard');
//View to User
}
else
{
$this->template->client('dashboard/dashboard');
//View to Client
}
}
它在调用compare()之前检查字符串的大小,因此,不需要进一步优化。
永远记住软件工程的一个原则:KISS:P
答案 1 :(得分:1)
你想要做的是玩百分比。 由于字符串很可能不同,因此您希望尽快找到它。
您首先要比较长度,但不要假设长度计算成本低,与您正在做的其他事情相比。
这是我做过的事情(在C中):
if (a[0]==b[0] && strcmp(a, b)==0)
所以如果前导字符不同,它永远不会进入字符串比较。
如果数据集使得主要字符 可能不同,则会节省大量时间。
(strcmp
也有这种优化,但你仍然需要付出设置参数和进出函数的代价。我们在这里讨论的是少量循环。)< / p>
如果你做了类似的事情,那么你可能会发现循环迭代开销花费了很长一段时间。 如果是这样,您可以考虑展开它。 (编译器可能会为您展开它,但我不会依赖它。)
答案 2 :(得分:0)
比较数字比比较字符串要快。在比较字符串本身之前尝试比较字符串长度。