C++ 根据条件从两个不同集合中提取一对数字所需的优化?

C++ 根据条件从两个不同集合中提取一对数字所需的优化?,c++,performance,map,stl,C++,Performance,Map,Stl,我需要两个向量的类型 typedef long long LL ; vector < LL > store1 , store2 ; 两个存储区中的每个元素只使用一次以形成一对 我目前使用的方法非常缓慢。 我的方法 ll gcd(ll a, ll b) { return (b == 0 ? a : gcd(b, a % b)); } vector < LL > :: iterator it , fit ; LL

我需要两个向量的类型

      typedef long long LL  ;

      vector < LL > store1 , store2 ;
两个存储区中的每个元素只使用一次以形成一对

我目前使用的方法非常缓慢。 我的方法

     ll gcd(ll a, ll b) { return (b == 0 ? a : gcd(b, a % b)); }

     vector < LL > :: iterator it , fit ;
     LL ans = 0 ;         
           // count of pairs
     for ( it = store1.begin() ; it != store1.end() ; it++)
     {
           LL x = (*it) ;

           for( fit = store2.begin() ; fit != store2.end() ; fit++){

              LL y = (*fit) ;
              if ( gcd(x,y) != 1){

                   ans++ ;
                   store2.erase(fit); break ;
              }   

           }
      }
llgcd(lla,llb){return(b==0?a:gcd(b,a%b));}
向量:迭代器,适合;
LL-ans=0;
//成对数
for(it=store1.begin();it!=store1.end();it++)
{
llx=(*it);
对于(fit=store2.begin();fit!=store2.end();fit++){
LL y=(*fit);
如果(gcd(x,y)!=1){
ans++;
存储2.擦除(适合);断开;
}   
}
}
时限:1s
所有号码是否都有存储号码范围的限制?看起来它们是64位整数,但实际上它们会占用整个空间吗?我发现很难相信发布的例程非常慢(除非gcd()函数中存在性能问题)。它只是不符合返回所有匹配夫妇的给定要求。它对第一个映射的每个条目所做的一切就是查找第一个匹配项,增加一个计数器,删除第二个映射中的匹配项。获取所有匹配项需要迭代每个组合并将匹配项添加到结果容器中。@stefaanv使用的Gcd函数是标准的欧几里德方法。@JohnZwinck我已经编辑了我的问题并提到了约束条件。@AmitKumar我建议您重新思考这个问题。如果从长远来看,您的算法的复杂度为^2,那么再多的优化也帮不了您。在短期内,通过将store2划分到所有可用的内核,您可以轻松地并行化该算法。
     ll gcd(ll a, ll b) { return (b == 0 ? a : gcd(b, a % b)); }

     vector < LL > :: iterator it , fit ;
     LL ans = 0 ;         
           // count of pairs
     for ( it = store1.begin() ; it != store1.end() ; it++)
     {
           LL x = (*it) ;

           for( fit = store2.begin() ; fit != store2.end() ; fit++){

              LL y = (*fit) ;
              if ( gcd(x,y) != 1){

                   ans++ ;
                   store2.erase(fit); break ;
              }   

           }
      }