我正在用C ++做一些示例程序。我在文本文件中有100,000个单列数据。我将所有数据加载到std :: vector中。现在我需要检查每个数据的第一个字符是“#”还是“%”或“$”。数据以“#”,“$”,“%”的方式排序。我可以像下面这样编程。
for ( i = 0; i < myArray.size(); i++)
{
if(mrarray[i][0]=='#')
{
// do some process for '#' values
}
else if(mrarray[i][0]=='$')
{
// do some process for '$' values
}
else if(mrarray[i][0]=='%')
{
// do some process for '%' values
}
}
我的问题是“这是一种最好的方式吗?。有没有其他方法可以更好地提高效率?”
答案 0 :(得分:1)
它的效率与它一样高,唯一可以让它更快一点的就是使用switch语句。
for ( i = 0; i < myArray.size(); i++)
{
switch(myArray[i][0]){
case '#':
// Do stuff
break;
case '$':
// Do stuff
break;
case '%':
// Do stuff
break;
}
}
我也假设你只做过一次。如果您使用相同的数据多次执行此操作,则可以通过对其进行排序来提高效率。如果是这样的话,请告诉我,我会更新我的答案。
答案 1 :(得分:1)
作为why-is-processing-a-sorted-array-faster-than-an-unsorted-array中的状态,可能更有效地排序您的行(基于第一个字符),然后处理您的向量。
大卫提出的转换声明将是我的选择。
但作为替代方案,您可以尝试一组函数指针,例如:
using my_function_pointer = void (*)(const std::string&/*, other required stuff*/);
const my_function_pointer funs[256] = { dummy_f, dummy_f, .., f_charp, f_dollar, f_mod, dummy_f, ..};
for ( i = 0; i < myArray.size(); i++) {
funs[myArray[i][0]](myArray[i] /*, other required stuff*/);
}
无论如何,您需要根据任何优化对您的更改进行基准测试。