我创建了一个config
类,它从配置YAML
加载配置。我已经为每种类型
// Pseudo Code
class config
{
private:
std::vector<std::string> c_name;
public:
config(yaml_file_path)
{
// Handles reading from yaml and loading data to c_name container.
load(yaml_file_path);
}
std::vector<std::string> get_name()
{
return c_name;
}
};
我在其他类中使用这个对象来获取名称config。
class loadConfig
{
config cfg(yaml_file_path);
std::vector<std::string> name = cfg.get_name();
// Further use of vector name like checks.
}
什么会更好?(作为代码实践和执行时间和/或内存空间)
- 在代码的各个地方使用
get_name()
函数。或 - 在容器中复制值,正如我所做的那样?
哪个更好?(作为代码实践和执行时间和/或内存空间)
您的get_name()
函数在每次调用时都复制容器。这是非常昂贵的,只要您不想在类之外修改它,就不需要这样做。
我建议使用一个/两个重载,以便编译器可以选择您调用的(非const/const)对象:
// for the non-const `config` objects call
std::vector<std::string>& get_name() /* noexcept */ {
return c_name;
}
// for the const `config` objects
const std::vector<std::string>& get_name() const /* noexcept */ {
return c_name;
}
现在在调用者,你可以有
auto& name = cfg.get_name(); // non-const ref for further modifications
或
const auto& name = cfg.get_name(); // const-ref for read only purposes.
在这两种情况下,您都不会复制容器。
话虽如此,对于像config
这样只有一个容器作为内部存储的类,我个人最喜欢的是通过提供begin
和end
重载来使类可迭代:
class config
{
std::vector<std::string> c_name;
public:
auto begin() noexcept { return c_name.begin(); }
auto cbegin() const noexcept { return c_name.cbegin(); }
auto end() noexcept { return c_name.end(); }
auto cend() noexcept { return c_name.cend(); }
};
这使得您编写的代码如>
config names;
for (auto& name : names) // or for (auto const& name : names)
{
// ...do something with names
}