函数指针与直接调用cout 我正在做C++类作业,我想输入一些。我并不是在寻找作业的“帮助”,而是把课堂作业作为练习编写“好”代码的借口,而我正在讨论两种解决当前问题的方法

函数指针与直接调用cout 我正在做C++类作业,我想输入一些。我并不是在寻找作业的“帮助”,而是把课堂作业作为练习编写“好”代码的借口,而我正在讨论两种解决当前问题的方法,c++,map,C++,Map,我在STL映射中存储了大约4000个值。这个程序的一个特点是打印出我地图上的每一个值。我有一个名为“driver”的类,它处理应用程序的内部逻辑并保存对映射的引用。我有一个单独的用户界面类 我要做的是将一个函数指针传递给我的驱动程序,该驱动程序在映射中迭代,并在UI类中调用该函数。在大约4000个函数调用的情况下,这是一个坏主意吗?我应该咬紧牙关,在迭代时简单地调用cout吗?我不太愿意这样做,因为我试图让我的用户界面与我的程序逻辑和数据完全隔离。我知道最后这真的不重要,因为这只是一个类作业,但

我在STL映射中存储了大约4000个值。这个程序的一个特点是打印出我地图上的每一个值。我有一个名为“driver”的类,它处理应用程序的内部逻辑并保存对映射的引用。我有一个单独的用户界面类


我要做的是将一个函数指针传递给我的驱动程序,该驱动程序在映射中迭代,并在UI类中调用该函数。在大约4000个函数调用的情况下,这是一个坏主意吗?我应该咬紧牙关,在迭代时简单地调用cout吗?我不太愿意这样做,因为我试图让我的用户界面与我的程序逻辑和数据完全隔离。我知道最后这真的不重要,因为这只是一个类作业,但假设这是我希望长期维护的代码,“最佳”实践是什么?

简短回答:别担心。4k间接呼叫不是什么大问题。如果您担心性能,请执行以下操作:

  • 用简单的方法编写代码
  • 性能好吗?完成了
  • 表现不好?使用探查器,比如,找出原因,然后只修复所需内容
记住,“过早优化是万恶之源。”

稍长一点的版本:您可以如下定义回拨:

template <typename IteratorType>
void my_multi_callback(iterator start, iterator end);
模板
作废我的多线程回调(迭代器开始、迭代器结束);

然后,驱动程序只需传递适当的
map
迭代器(描述要打印的内容的范围)。然后回调对每个元素执行输出,这样就避免了重复的间接函数调用。

我可能会传入一个迭代器。如果要将数据打印到
cout
,请传递
ostream\u迭代器。稍后,如果您想(例如)将数据从映射复制到向量或其他类似的对象,您可以传递一个不同的迭代器(在这种情况下,可能是back_插入器)


这提供了灵活性,但由于迭代器基本上是一个函子,它还(通常)消除了通过指针调用函数的开销。当您复制到标准输出时,这可能无关紧要(通过指针调用函数的时间与实际写入流的时间相比非常少),但是当/如果复制到其他地方时,速度可能更重要。

谢谢!你稍微长一点的版本肯定是我要尝试的,这是一个非常好的解决方案。+1对于合理的解决方案,它与我自己的(我断言也是合理的)解决方案完全相反:)@phooji:是的,在相反的方向上几乎是一样的。我也同意你的方法是非常合理的。我一直在研究这两种解决方案,对于这一种,在映射中使用ostream_迭代器似乎存在问题,因为映射迭代器返回一对。有什么优雅的方法可以解决这个问题吗?@sensae:其实没有问题,
ostream\u迭代器
通过
operator写东西非常奇怪,更仔细地看我的错误,它似乎在抱怨operator=,而不是operator=