我可以在C ++中像** vector <pair <int,vector =“” <=“” int =“” >>> vec **这样使用deltacar吗?

时间:2018-07-08 05:12:23

标签: c++ algorithm sorting stdvector std-pair

我可以在C ++中声明像vector < pair < int ,vector < int > > >vec这样的向量吗?

实际上,我想制作一个二维矢量(以一对的形式),其中一对的第一个元素对应于某个键(例如2 ,3 ,4),而第二个元素将保存一个vector。 我之所以要配对,是因为我想根据key(pair < int ,vector < int >的第一个元素)对二维向量进行排序。

如果是,那么如何获取每一行中存储的值?

我已经编写了代码,但是我知道它是不正确的。请提供帮助以及代码中的 sort()函数如何提供帮助。

/*  Box Stacking */

bool comp(pair<int,vector<int> >a,pair<int,vector<int> >b)   // sort ???
{
   return (a.first > b.first);
}

int maxHeight(int height[], int width[], int length[], int n)
{
   vector<pair<int,vector<int> > >vec;   // IS THIS DECLARATION CORRECT 
   vector<int> v;
   for(int i=0;i<n;i++)
   {
      v.push_back(height[i]);
      v.push_back(width[i]);
      v.push_back(length[i]);

      do
      {
         vec.push_back({(v[0]*v[1]),v});
      }while(next_permutation(v.begin(),v.end()));
      v.clear();
    }

    sort(vec.begin(),vec.end(),comp);
    int dp[n+2];

    for(int i=0;i<n;i++)
    {
       dp[i] = vec[i].second.[2];   // HERE HOW TO GET THE ELEMENT
    }                              //( I am tryinh to access the 2nd index element from each row)
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<i;j++)
        {
           if(vec[i].second.[0]<vec[j].second.[0] &&              // similar problem here
           vec[i].second.[1]<vec[j].second.[1]  && dp[i] < dp[j] + 1)
           {
               dp[i] = dp[j] + 1;
           }
        }
    }

    int maxi = 0;
    for(int i=0;i<n;i++)
    maxi = max(maxi,dp[i]);

    return maxi;
}

1 个答案:

答案 0 :(得分:0)

  

我可以在C ++中使用vector < pair <int ,vector < int >> > vec这样的代名词吗?

是的,可以。没错。

关于在此处访问值数组中的元素

std::pair<int, std::vector<int> >
          key,   vector_array

您需要为每个与向量数组关联的键。用operator[]访问数组元素将是array[array_index](或使用基于范围的for循环或迭代器循环)

这是second中的std::par。我.second[array_index]

由于您具有上述数组:vec[index_pair_array].second[array_index]是访问此2D数组中每个元素的适当方法。

那么您需要这个:

   for(int i=0;i<n;i++)
   {
      dp[i] = vec[i].second[2];   
   }                              
   for(int i=0;i<n;i++)
   {
       for(int j=0;j<i;j++)
       {
           if(vec[i].second[0] < vec[j].second[0] &&              // similar problem here
              vec[i].second[1] < vec[j].second[1]  && dp[i] < dp[j] + 1)
              {
                  dp[i] = dp[j] + 1;
              }
       }
   }