我正在尝试编写一个程序,考虑到我有大量的对象(包括一些数据,如id,name等) 我有一个显示菜单,如:
1)
display_menu()
{
vector< CD > CDArray;
//some statements to display
switch(choice)
{
//case1 , case 2, ...
case x;
for(int i=0; i < CDArray.size(); i++)
CDArray[i].printCD(); //printCD() is a method of class CD
//default
}
}
但如果向量/数组很大,这会导致很多函数调用开销,使其变慢。
2)我应该将函数printCD()声明为内联或
第3) 声明另一个对象来调用该函数并通过引用传递vector / array,如:
display_menu()
{
vector< CD > CDArray;
CD obj;
//some statements to display
switch(choice)
{
//case1 , case 2, ...
case x;
obj.printCD(CDArray); //CDArray is passed by reference
//default
}
}
第三种方法是否有问题
你会建议什么方法?
答案 0 :(得分:5)
你正在分析这个问题。首先让它可读,然后担心性能。你认为最大的性能瓶颈来源是100次中的99次是错误的。
修改强>:
要真正回答这个问题,我会考虑面向对象的设计。您的CD对象是否需要知道如何将自己打印到屏幕上?是否需要了解有关ostreams的任何信息?我认为答案是肯定的。在C ++中执行此类操作的最佳方法是要么具有辅助函数,该函数会使<<
运算符重载,以便它可以与ostream一起使用,而不会强制了解您的对象正在使用哪个流,或者具有返回对象的字符串表示形式的方法,这样您甚至不必担心字符串的去向。
答案 1 :(得分:1)
第三种方法很好,它是全球性的data-oriented方式,看起来很合适。
但是:
这里你的函数不需要是成员函数,它适用于一组CD对象而没有状态。所以你应该把它变成静态函数或全局函数。
我会设置命名空间和全局函数:
cdutil::print( CDArray );
但这很大程度上取决于函数的语义。在这里,我完全不确定它的含义。
答案 2 :(得分:1)
我会选择CD(或模板友元函数)中的(静态)方法,该方法知道如何打印由两个迭代器begin
和end
引用的CD集合。但是,这样做只是一个好主意,如果你真的需要在这里加速。
答案 3 :(得分:1)
您可以“扭转思路”并为CD类创建accept_visitor
方法,并创建 visitor 对象以传递给每个CD对象。这将在您的项目中为您提供更大的灵活性。有关详细信息,请与Web联系并搜索“访问者设计模式”。