C++ 添加两个大小不同的向量:最佳运行时间和最佳内存管理
我正在寻找一个运行时高效的小工具,它可以(成对)添加存储在两个整数向量(C++ 添加两个大小不同的向量:最佳运行时间和最佳内存管理,c++,loops,for-loop,vector,bit-manipulation,C++,Loops,For Loop,Vector,Bit Manipulation,我正在寻找一个运行时高效的小工具,它可以(成对)添加存储在两个整数向量(向量a和向量b)中的整数值,这也是内存高效的。将假定向量大小不同或相等 我得到的是: vector<int> c; if( a.size() > b.size() ) { for( size_t i = 0 ; i < b.size() ; ++i ) { c.push_back(a[i]+b[i]); }
向量a
和向量b
)中的整数值,这也是内存高效的。将假定向量大小不同或相等
我得到的是:
vector<int> c;
if( a.size() > b.size() )
{
for( size_t i = 0 ; i < b.size() ; ++i )
{
c.push_back(a[i]+b[i]);
}
else if ( a.size() < b.size() )
{
for( size_t i = 0 ; i < a.size() ; ++i )
{
c.push_back(a[i]+b[i]);
}
}
else
{
for( size_t i = 0 ; i < a.size() ; ++i )
{
c.push_back(a[i]+b[i]);
}
}
向量c;
如果(a.size()>b.size())
{
对于(大小i=0;i
例如: 向量a->(0)(12)(0)(0)(123)(12) 向量b->(305)(10)(3)(4)(8201)(230)(0)(0)(0)
向量c
->(305)(22)(3)(4)(8324)(242)(0)(0)标准::向量c;
const size_t minSize=std::min(a.size(),b.size());
c、 保留(minSize);//避免无用的重新分配
对于(大小i=0;istd::vector c;
const size_t minSize=std::min(a.size(),b.size());
c、 保留(minSize);//避免无用的重新分配
对于(大小i=0;i
您可以使用:
#包含//用于变换和最小值
#包含//用于std::plus
#include//for std::begin,但它是
//隐式包含在
std::载体a;
std::载体b;
自动大小=标准::最小值(a.size(),b.size());
std::vector c(size);//创建第三个足够大的向量,以便生成结果
std::transform(
开始(a),开始(a)+尺寸,开始(b),
开始(c),std::plus()
);
在std::transform
下面是一个循环,它从每个范围(由前三个参数定义)中提取一个元素,对它们应用二进制函数(最后一个参数std::plus
),并将结果存储在第三个范围(第四个参数)中
它没有比遍历所有元素更好的w.r.t.“运行时效率”。您的解决方案接近最优。但标准算法还有一个额外的好处,即意图明确,编译器可能知道如何高效地优化它们。您可以使用:
#包含//用于变换和最小值
#包含//用于std::plus
#include//for std::begin,但它是
//隐式包含在
std::载体a;
std::载体b;
自动大小=标准::最小值(a.size(),b.size());
std::vector c(size);//创建第三个足够大的向量,以便生成结果
std::transform(
开始(a),开始(a)+尺寸,开始(b),
开始(c),std::plus()
);
在std::transform
下面是一个循环,它从每个范围(由前三个参数定义)中提取一个元素,对它们应用二进制函数(最后一个参数std::plus
),并将结果存储在第三个范围(第四个参数)中
它没有得到更好的w.r.t.“运行时效率”而不是迭代所有元素。您的解决方案接近最优。但是标准算法还有一个额外的好处,即明确的意图,并且编译器可能知道如何有效地优化它们。假设大小不同或相等似乎是一个公平的假设……为什么您的代码与示例相矛盾?我是一个基于我的答案,在添加示例之前,因为我还没有把所有的东西都放在我的脑子里。如果你想让你的算法既快速又高效,你就应该考虑加上代替使用第三向量来保存你的结果。(a)
完全忘记向量c。假设大小不同或相等似乎是一个公平的假设…为什么你的代码与你的示例相矛盾?我的答案是基于你的代码,在添加示例之前。因为我还没有把所有的东西都放在脑中。如果你想让你的算法都快速ND内存效率高,您应该考虑使用第三位向量来代替您的结果。使用JROKS ANWSER,您将替换<代码>开始(C)<代码> > <代码>开始(a)完全忘记向量c。@Loiebeedictemin
是两个值之间的最小值。它是本机的?我不必创建它?前缀std::
应该给你一个提示:它是标准库的一部分。所以是的,它是“本机的”。具体来说,您必须#包括噢,min
来自
@loiebenedictmin
是两个值之间的最小值。它是本机的?我不必创建它。std:
前缀应该给您一个提示:它是标准库的一部分。因此,它是“本机的”。具体来说,你必须#include
哦,min
来自
。转换
在这里做什么?你遗漏了关键部分的注释。哦,我没有看到上面的链接,但是,用你自己的话来说,这是做什么的?有趣的是,我知道你的解决方案将产生与我相同的汇编代码。但我不能让我自己去理解那些卷积。反正O_O+1。我明白了……这也可以用减法和乘法来完成吗?@Loiebeedicte当然,只要用std::plus
或std::multiples
替换std::multiples
。transform
在这里做什么?你遗漏了关键部分的注释。哦,我没有看到l上面的墨水,但是,用你自己的话来说,这能做什么?有趣的是,我知道你的解决方案将产生与我的完全相同的汇编代码。但我无法理解这些卷积。不管怎样,O_O+1。我明白了……这也可以用减法和乘法来完成吗?@Loiebenedict当然,用<
std::vector<int> c;
const size_t minSize = std::min(a.size(), b.size());
c.reserve(minSize); // avoids useless reallocation
for (size_t i = 0; i < minSize; ++i)
c.push_back(a[i] + b[i]);
#include <algorithm> // for transform and min
#include <functional> // for std::plus
#include <iterator> // for std::begin, but it's
// implicitly included by <vector>
std::vector<int> a;
std::vector<int> b;
auto size = std::min(a.size(), b.size());
std::vector<int> c(size); // creates the third vector big enough for results
std::transform(
begin(a), begin(a)+size, begin(b),
begin(c), std::plus<int>()
);