gpt4 book ai didi

c++ - std::vector 到 std::vector 的最快方法

转载 作者:搜寻专家 更新时间:2023-10-31 02:11:48 24 4
gpt4 key购买 nike

测试代码如下:

class A{};
class B : public A{};

void Test(const std::vector<A>& a)
{
}

int main()
{
std::vector<A> a;
std::vector<B> b;
Test(a);
Test(b);//Compiler Error
return 0;
}

std::vector<A>std::vector<B>是不同的类型,我们无法从一种转换为另一种。

一个可选的方式可以是:

class A{};
class B : public A{};

void Test(const std::vector<A>& a)
{
}

int main()
{
std::vector<A> a;
std::vector<B> b;
Test(a);
Test(std::vector<A>(b.begin(), b.end()));
return 0;
}

它起作用了,但它需要从 B 进行额外的复制至 A .如果AB是一个大对象,它可能会很慢。更好的选择是:

class A{};
class B : public A{};

void Test(const std::vector<A>& a)
{
}

int main()
{
std::vector<A> a;
std::vector<B> b;
Test(a);
Test(std::vector<A>(std::make_move_iterator(b.begin()), std::make_move_iterator(b.end())));
return 0;
}

因为它只是移动 iter 而不是整个 B类,它需要更好的性能。但是有一些额外的费用-如果b是一个包含大量项目的非常大的 vector ,迭代也会降低我的代码速度。

所以想知道有没有办法直接转换std::vector<B>std::vector<A>没有任何额外费用?

最佳答案

一种方法是使 vector 成为测试函数的模板参数。调用代码将保持不变,无需复制。

#include <vector>
#include <iostream>

class A{
public:
virtual void print() const {
std::cout << "A" << std::endl;
}
};
class B : public A{
virtual void print() const {
std::cout << "B" << std::endl;
}
};

template <typename ContainerA>
void Test(const ContainerA& aas)
{
for(const A& a:aas) {
a.print();
}
}

int main()
{
std::vector<A> a;
a.push_back(A());
std::vector<B> b;
b.push_back(B());
Test(a);
Test(b);
return 0;
}

关于c++ - std::vector<Derived> 到 std::vector<Base> 的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43083565/

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