gpt4 book ai didi

c++ - 将 std::vector 转换为另一个 std::vector 的最快方法

转载 作者:IT老高 更新时间:2023-10-28 22:22:55 28 4
gpt4 key购买 nike

将 std::vector 从一种数据类型转换为另一种数据类型的最快方法(如果有的话)是什么(以节省空间的想法)?例如:

std::vector<unsigned short> ----> std::vector<bool> 

我们显然假设第一个 vector 只包含 0 和 1。在 vector 非常大的情况下,逐个元素复制效率非常低。

条件问题:如果您认为没有办法更快地做到这一点,是否有一种复杂的数据类型实际上允许从一种数据类型快速转换为另一种数据类型?

最佳答案

std::vector<bool> 

停止。

一个 std::vector<bool>不是。 std::vector具有使用类型 bool 的特化,这会导致 vector 发生某些变化.也就是说,它不再像 std::vector .

标准保证您可以使用 std::vector 执行某些操作.和vector<bool>违反了这些保证。所以你应该非常小心使用它们。

不管怎样,我会假装你说vector<int>而不是 vector<bool> ,因为后者确实使事情复杂化。

Copying element by element is highly inefficient in case of a really large vector.

只有当你做错了。

需要仔细进行所需类型的 vector 转换以提高效率。

如果来源T类型可转换为目标 T ,那么这很好用:

vector<Tnew> vec_new(vec_old.begin(), vec_old.end());

体面的实现应该识别它们何时被赋予随机访问迭代器并适本地优化内存分配和循环。

对于简单类型的不可转换类型,最大的问题是不这样做:

std::vector<int> newVec(oldVec.size());

这很糟糕。这将分配一个适当大小的缓冲区,但它会用数据填充它。即默认构造的int s (int())。

相反,您应该这样做:

std::vector<int> newVec;
newVec.reserve(oldVec.size());

这保留了与原始 vector 相等的容量,但也确保不会发生默认构造。您现在可以push_back让你心满意足,知道你永远不会在你的新 vector 中造成重新分配。

从那里,您可以循环遍历旧 vector 中的每个条目,根据需要进行转换。

关于c++ - 将 std::vector 转换为另一个 std::vector 的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7899838/

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