Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 添加两个大小不同的向量:最佳运行时间和最佳内存管理_C++_Loops_For Loop_Vector_Bit Manipulation - Fatal编程技术网

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;i
std::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。@Loiebeedicte
min
是两个值之间的最小值。它是本机的?我不必创建它?前缀
std::
应该给你一个提示:它是标准库的一部分。所以是的,它是“本机的”。具体来说,您必须
#包括
噢,
min
来自
@loiebenedict
min
是两个值之间的最小值。它是本机的?我不必创建它。
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>()
);