实现常量对象列表

Implement a list of constant objects

本文关键字:列表 对象 常量 实现      更新时间:2023-10-16

假设我有一个基本的类Object,它有一些int s和std::string s(所以不是很大)。

现在,我需要某种不会更改的Object列表,但我仍然应该能够搜索它(例如使用函数)。此"列表"仅在编译时创建,它将包含大约 60 个对象。我目前有 2 个解决方案:

  1. 创建一个具有std::vector<Object>并在构造函数中初始化的类Objects(以及搜索函数)。
  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;
    }
}

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

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;
}