gpt4 book ai didi

c++ - 实现常量对象列表

转载 作者:行者123 更新时间:2023-11-30 03:43:27 27 4
gpt4 key购买 nike

假设我有一个基础类 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;
}
}

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

最佳答案

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

关于c++ - 实现常量对象列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36091849/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com