实现常量对象列表
Implement a list of constant objects
假设我有一个基本的类Object
,它有一些int
s和std::string
s(所以不是很大)。
现在,我需要某种不会更改的Object
列表,但我仍然应该能够搜索它(例如使用函数)。此"列表"仅在编译时创建,它将包含大约 60 个对象。我目前有 2 个解决方案:
- 创建一个具有
std::vector<Object>
并在构造函数中初始化的类Objects
(以及搜索函数)。 - 创建一个命名空间,其中包含作为常量的
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++ 创建包含链表和字符串的对象的链接列表时出错
- 我使用向量来创建类对象列表.初始化向量时如何使用参数调用构造函数?
- 从封装在对象中的函数 C++ 返回时为空的列表
- 如何在不销毁对象的情况下返回对象列表
- 如何使用Q_PROPERTY公开自定义对象列表
- 链接列表在 cpp 中包含不同的对象类
- 如何使用对象制作分数列表并获得平均值
- 什么更好?返回对象指针列表?或返回指向对象列表的指针?
- 如何将成员函数作为参数传递并在派生对象上执行方法列表
- 我可以从列表中获取对象并复制它们,但如何删除我复制的对象?
- 如何获取列表的每个对象并调用getName方法来打印其名称
- 如何在Windows Media Foundation SDK中指定语言列表对象
- 在 DLL 中嵌入 Python:Py_DECREF列表对象时访问冲突读取位置
- 将类的每个实例添加到列表对象的构造函数
- 列表<对象*>迭代器中的分段错误
- 如何使用list::sort()对STL列表对象进行排序,同时将自定义排序函数作为参数传递给list::排序
- 如何防止客户端修改列表对象
- c++列表对象错误
- 在列表对象中使用对象的派生函数
- 编译器错误 使用列表<对象*的迭代器> C++