减少大数据的条件语句

Reducing Condition statement for Large data

本文关键字:条件 语句 数据      更新时间:2023-10-16

我正在用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
  }
}

我的问题是" 这是最好的方法吗? .还有其他方法可以更有效地完成此程序吗?" ???

这几乎是最有效的,唯一能让它更快一点的是使用 switch 语句。

for ( i = 0; i < myArray.size(); i++)
{
  switch(myArray[i][0]){
    case '#':
      // Do stuff
      break;
    case '$':
      // Do stuff
      break;
    case '%':
      // Do stuff
      break;
  }
}

我也假设你只做一次。如果您使用相同的数据多次执行此操作,则可以通过对其进行排序来提高效率。如果是这种情况,请告诉我,我会更新我的答案。

由于 why-is-processing-a-sorted-array-fast-by-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*/);
}

无论如何,您需要对更改进行基准测试,以进行任何优化。