使用switch / case或if / else

时间:2018-02-02 17:46:06

标签: c++ c++11 if-statement switch-statement lookup-tables

我有一个模型系统,可以在某个时间步骤生成变量列表。 另一方面,用户仅对每个时间步的这些变量的子集感兴趣。我需要在每个时间步骤保存它们。

那么如何设计一个容器/地图来处理呢? 目前我在每个时间步使用了一个开关/ case:在迭代器循环中,如果所需的变量(std :: string)在容器内,那么它将被保存。

我担心这样做不够有效,因为程序需要在每个时间步骤判断即使一次就足够了,我在表中有100个以上的变量,用户期望的可能是10 +。

有更好的方法吗?

以下是我现在可以提供的伪代码示例:

//vector or map for lookup table
map.clear();
map.insert(key-value pair);
map.insert(key-value pair);
map.insert(key-value pair);
map.insert(key-value pair);
map.insert(key-value pair);
...

void main()
{
   get_user_data();
   run_model();
} 
function get_user_data()
{
   while(~eof)
   {
     read_line_data;
     desired_container.insert(a desired variable key-vale);
     //or vector.push_bash(variable) 
   }

}
function run_model()
{
   for(iTime_step=1; 100000+; iTimestep++)
   {
     some process;
     save();  
   }
}
function save()
{
  for(i=0;i<desired_container_length,i++) //use iterator
  {
    key = desired_container.at(i);
    switch(key)
    {
      case 1: do something
      case 2: do something else
      ...       
    }     
  }
}

密钥可以是std :: string,也可以是其他东西。 在这种情况下,使用switch / case要求必须严格排序map键值。 如果我使用if / else,那么程序必须确定/与每个查找表对象进行比较。

在这两种情况下,在时间步骤2~中,程序必须重复相同的开关/情况/或if / else,这似乎是不必要的。

谢谢。

1 个答案:

答案 0 :(得分:0)

如果我理解正确,你做的很好。如果在您的代码中,desired_container只是要保存的变量列表&#34;通过save函数,你不会经历整个可能的变量集;只有你需要经历的那些。

另一个问题是程序必须确定要做什么,或者让每个变量说出要调用的函数。使用交换机或散列图不会产生太大的影响,除了你不能使用交换机进行其他几种预定义类型的交换,而不需要在幕后使用一些黑客或更多代码。并且你不应该关心通过交换机或散列图的性能,特别是当你之后执行昂贵的操作时,我猜测&#34;保存&#34;可能是。

然而,如果在分析后,您发现它仍然花费了太多时间,那么您可以预先计划&#34;保存操作。假设每个变量对应一个保存函数,那么一旦知道了用户感兴趣的变量,就可以构建相应函数的向量。 save函数只需调用向量中的每个函数,而无需使用&#34; desired_container&#34;或任何开关或散列映射。

相关问题