如何合并两个不同大小的向量对

时间:2018-09-23 05:56:59

标签: c++ vector std-pair

我有两个向量要合并为一个。两者都是嵌入式对向量(以便能够在一对中容纳3个int值),并且它们的大小互不相同。

两个对向量和合并向量的代码为:

**Table.Vue(child, generic-table)**
<table class="table table-bordered">
  <thead>
    <tr>
      <th v-for="col in options.cols" :key="col.id">
        <template v-if="col.colRenderer">
          {{col.colRenderer(col)}}
        </template>
        <template v-else>
          {{col.label}}
        </template>
      </th>
    </tr>
  </thead>
  <tbody>
    <tr v-for="datum in data" :key="datum.id" @click="(e)=> options.rowProps.onClick ? options.rowProps.onClick(e, datum): ''">
      <td v-for="col in options.cols" :key="col.id" @click="()=> col.onClick ? col.onClick(datum[col.dataKey]): ''">
        <template v-if="col.cellSlot">
          <slot :name="col.cellSlot.name" :data="datum[col.dataKey]"/>
        </template>
        <template v-else>
          {{datum[col.dataKey]}}
        </template>
      </td>
    </tr>
  </tbody>
</table>

**Calling component(Parent, with Custom Data cells)**
<v-table
  :name="carePlanName"
  :options="tableProps"
  :total-count="totalCount"
  :data="users" >      
    <div
      slot=""
      slot-scope="slotProps">
      <!-- Define a custom template for CellData Data -->
      <!-- `slotProps` to customize each todo.            -->
      <span v-if="slotProps">✓
        <button>{{ slotProps.name }}</button>
      </span>
    </div>
</v-table>

其中sizeOfFinalVect等于parentVect + childVect的大小。

parentVect = {(0 3 9),(1 3 9),(2 2 15)}
 childVect = {(0 1 9)}

我跑步时:

vector < pair<int, pair<int,int> > > parentVect;
vector < pair<int, pair<int,int> > > childVect;
vector < pair<int, pair<int,int> > > mergedVect;

(我知道forloop不会“合并”两者,我想检查它是否至少将parentVect对添加到mergedVect中)

我的输出是:

mergedVect = {(0 0 0),(0 0 0),(0 0 0)}

向量按对中的最后一个整数排序,所以我想要的输出是:

mergedVect = {(0 3 9),(1 3 9),(0 1 9),(2 2 15)}

对此非常感谢!

编辑:

使用合并:

 for(int i=0; i<mergedVect.size();i++){
    mergedVect.push_back(make_pair(parentVect[i].second.second, make_pair(parentVect[i].second.first, parentVect[i].first)));
}

我的输出是 mergedVect = {(0 1 9),(0 3 9),(1 3 9),(2 2 15)}

1 个答案:

答案 0 :(得分:1)

如果要将两个排序的序列合并为一个序列,则应该利用的算法功能是std::merge

以下是使用您的数据的示例:

#include <vector>
#include <utility>
#include <iostream>
#include <algorithm>
#include <iterator>

typedef std::pair<int, int> PairInt;
typedef std::pair<int, PairInt> PairPairInt;
typedef std::vector<PairPairInt> PairVect;

// lambda that compares the pairs on the last value in the pair sequence
auto comparer = [](const PairPairInt& p1, const PairPairInt& p2) {return p1.second.second < p2.second.second; };

int main()
{
    PairVect parentVect = { { 0,{ 3, 9 } },{ 1,{ 3, 9 } },{ 2,{ 2, 15 } } };
    PairVect childVect = { { 0,{ 1, 9 } } };
    PairVect mergedVect;

    // First, sort the sequences based on the criteria that the
    // last number in the pairs is sorted in ascending order
    std::sort(parentVect.begin(), parentVect.end(), comparer);
    std::sort(childVect.begin(), childVect.end(), comparer);

    // Now merge the two sequences above, using the same sorting criteria
    std::merge(parentVect.begin(), parentVect.end(), 
               childVect.begin(), childVect.end(), 
               std::back_inserter(mergedVect), comparer);

    for (auto& p : mergedVect)
        std::cout << "{" << p.first << " " << p.second.first << " " << p.second.second << "}\n";
}

输出:

{0 3 9}
{1 3 9}
{0 1 9}
{2 2 15}

Live Example

请注意std::sort的用法,因为std::merge需要排序范围。