gpt4 book ai didi

c++ - 从其他容器构造的 STL 容器(例如,从 vector 列表)

转载 作者:太空狗 更新时间:2023-10-29 20:13:57 26 4
gpt4 key购买 nike

在我的代码中,有时我需要从另一个容器构造一个容器。但是这些容器对象是不同类型的,所以我不能使用复制构造函数。我所做的看起来像这样(C++11,我使用统一初始化和构造函数委托(delegate)):

std::vector<int> source {1, 3, 5, 7, 9};
std::list<int> destination (source.begin (), source.end ());

我意识到 std::list 可以有一个这样的构造函数,让事情变得更漂亮:

template </* ... */>
class list
{
public:
template <class Container> list (const Container& container)
: list (container.begin (), container.end ())
{
}

/* ... */
};

不幸的是,我只能对自己的类执行此操作,而不能对 STL 类执行此操作。那么第一个问题,STL 和 Boost 中不存在此类构造函数的原因是什么?第二个问题,是否有一种安全的方法来为 STL 容器实现这样的 ctor,也许可以通过某种方式定义转换运算符?

这个问题 os 当然只是为了方便,对代码或程序行为没有任何关键意义。但它可以使代码看起来更具可读性:

std::vector<int> source {1, 3, 5, 7, 9};
std::list<int> destination = source;

最佳答案

您应该对将一种容器类型的完整范围复制到另一种容器类型的代码持怀疑态度。这是一项不常见的事件。

在 C++ 中,显式转换通常是首选。通常不鼓励从一种类型转换为另一种类型的隐式转换和赋值运算符,因为它们有时会导致意外转换。

如果您确实需要在容器类型之间频繁转换,请尝试为转换定义一个显式辅助函数:

template<typename ToType, typename FromType>
ToType container_cast(const FromType& source)
{
return ToType(source.begin(), source.end(), source.get_allocator());
}

然后你的例子变成:

std::vector<int> source {1, 3, 5, 7, 9};
auto destination = container_cast<std::list<int> >(source);

关于c++ - 从其他容器构造的 STL 容器(例如,从 vector 列表),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18814215/

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