STL 容器由其他容器构造(例如,来自向量的列表)
STL Container constructed from other container (e.g. list from vector)
在我的代码中,有时我需要从另一个容器构造一个容器。但是这些容器对象是不同类型的,所以我不能使用复制构造函数。我所做的看起来像这样(C++11,我使用统一的初始化和构造函数委托):
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,也许通过以某种方式定义转换运算符?
这个问题当然只是一个方便的问题,对代码或程序行为没有什么关键。但它可以使代码看起来更具可读性:
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++14 中有一个建议,如果我没记错的话,可以将另一个容器作为"可遍历"直接传递给容器的构造函数。
该提案的最新修订版可以在这里找到。
我认为问题是,让容器从任何可迭代的东西实例化会导致很多意想不到的行为和歧义。例如:
auto mystring = std::string { "ABC" };
auto mylist = std::list { mystring };
mylist
在这里实例化为只有一个元素的字符串列表(如目前 C++17 的情况),还是作为三个字符"A"、"B"和"C"的列表,就像在可迭代展开中一样?使展开显式可以巧妙地解决这个问题,即使编写起来有点乏味。
相关文章:
- 如何在向量列表初始化时避免对象复制以及如何延长临时的生存期
- 如何在C++中声明抽象类的向量列表?
- 创建以向量/列表迭代器为键的映射
- 如何在不以不同方式创建每个向量的情况下制作 2-D 向量列表?
- 在为工作线程访问 lambda 中捕获的向量列表中的元素引用时,是否需要互斥锁?
- 根据优先级对向量列表进行字典式排序
- SIGBART 错误向量<列表<myClass>>
- C++向量列表
- 基本STL:向量列表或列表向量,在这种特殊情况下哪个会更好
- 通过 JNI 传递、返回和转换为向量列表列表
- C++:向量中向量列表的有效复制
- 从向量列表调用成员函数指针
- 多类型容器(数组/向量/列表)传统上是如何在C++实现的?(当然没有元组)
- 从向量列表c++中删除一个向量元素
- 向量列表(c++)
- 从整数向量列表中删除重复项的快速方法
- 初始化动态向量列表
- 当输出向量列表时,输出的量是平方的
- 在并行追加时,使用向量列表和向量的向量对性能的影响
- 在向量/列表中,您是否真的将其应用于对象?(C++)