2016-03-18 76 views
1

假设我有一个基本类Object,其中有一些int s和std::string s(所以不是很大)。实现一个常量对象列表

现在,我需要某种不会改变的列表Object,但我应该仍然可以搜索它(例如使用函数)。这个“列表”仅在编译时创建,它将具有约。 60个物体。我现在有2个解决方案:

  1. 创建一个类Objects具有std::vector<Object>和被在构造函数中初始化(与搜索功能一起)。
  2. 创建一个名称空间,其中包含Objects作为常量,std::vector<Object>用于搜索(以及类似的)函数(将在名称空间中定义)。

1的一个缺点是每次需要访问它时都必须创建60多个对象。 2可能没问题,但是不要忘记将新对象放在std::vector以及顶部“列表”中。

1可能实现这样的:

class Objects 
{ 
public: 
    Objects() 
    { 
     list.push_back(Object{ 0 }); 
     list.push_back(Object{ 1 }); 
    }; 

    bool hasValue(int value) 
    { 
     for (auto& obj: list) 
     { 
      if (obj.getValue() == value) 
       return true; 
     } 

     return false; 
    } 

private: 
    std::vector<Object> list; 
}; 

2像这样:

namespace Objects 
{ 
    const Object obj1{ 0 }; 
    const Object obj2{ 1 }; 

    const std::vector<Object> list{ obj1, obj2 }; 

    bool hasValue(int value) 
    { 
     for (auto& obj: list) 
     { 
      if (obj.getValue() == value) 
       return true; 
     } 

     return false; 
    } 
} 

哪种方式是最好的编码实践和/或可用性/可维护性方面?也许还有另一种我没有想到的方式?

+0

这取决于。 Object的特性,它有多大,会有多少,列表是否需要在运行时建立,或者是否可以在编译时计算。你能详细说明吗?也许发布一个小程序来演示用例? –

回答

2

20永不变更,需要始终可用的对象?

听起来像一个返回对静态数组的引用的函数的作业。所有标准算法(在这种情况下为find_if)均可与std::array配合使用。

#include <iostream> 
#include <array> 

struct Object 
{ 
    Object(int i) : _i(i) {}; 

    int _i; 
}; 

const std::array<Object, 20>& objects() 
{ 
    static std::array<Object, 20> os = { 
     Object(1), 
     Object(2), 
     Object(3), 
     Object(4), 
     Object(5), 
     Object(6), 
     Object(7), 
     Object(8), 
     Object(9), 
     Object(10), 
     Object(11), 
     Object(12), 
     Object(13), 
     Object(14), 
     Object(15), 
     Object(16), 
     Object(17), 
     Object(18), 
     Object(19), 
     Object(20) 
    }; 
    return os; 
} 


int main() 
{ 
    using namespace std; 
    auto const& os = objects(); 
    auto i_ten = std::find_if(std::begin(os), 
           std::end(os), 
           [](auto const& o) { 
            return o._i == 10; }); 

    cout << i_ten->_i << std::endl; 

    return 0; 
} 
相关问题