【问题标题】:Some problem about the algorithm of merging two lists关于合并两个列表的算法的一些问题
【发布时间】:2019-09-08 20:55:53
【问题描述】:

我在练习编写合并两个列表的算法时遇到了一些问题。

#include<iostream>
#include<vector>
using namespace std;
int main(){
    vector<int> list1,list2;
    int tmp;
    cin>>tmp;
    while(tmp!=-1){
        list1.push_back(tmp);
        cin>>tmp;
    }
    cin>>tmp;
    while(tmp!=-1){
        list2.push_back(tmp);
        cin>>tmp;
    }
    vector<int> list3(list1.size()+list2.size());
    vector<int>::iterator iter1=list1.begin();
    vector<int>::iterator iter2=list2.begin();
    while(iter1!=list1.end()&&iter2!=list2.end()){
        if(*iter1<*iter2){
            list3.push_back(*iter1);
            iter1++;
        }
        else{
            list3.push_back(*iter2);
            iter2++;
        }
    }
    while(iter1!=list1.end()){
        list3.push_back(*iter1);
        iter1++;
    }
    while(iter2!=list2.end()){
        list3.push_back(*iter2);
        iter2++;
    }
    if(list3.size()==0) cout<<"NULL";
    for(int i=0;i<list3.size();i++){
        cout<<list3[i];
        if(i!=list3.size()-1){
            cout<<" ";
        }
    }
    return 0;
}

控制台输入:

1 3 5 -1

2 4 6 8 10 -1

预期的输出结果: 1 2 3 4 5 6 8 10

实际输出结果: 0 0 0 0 0 0 0 0 1 2 3 4 5 6 8 10

【问题讨论】:

  • 那么在使用调试器逐行执行代码时,您观察到了什么?
  • 像这样构造向量向量 list3(list1.size()+list2.size());用给定大小的零填充它,考虑将此行更改为 vector list3;
  • 考虑阅读constructor of std::vectorstd::vector::reserve 的文档。他们不做同样的事情,而且看起来你想使用std::vector::reserve

标签: c++ algorithm list data-structures


【解决方案1】:
vector<int> list3(list1.size()+list2.size());

应该是

vector<int> list3;

第一个构造函数用N+M个元素初始化向量,全部初始化为0,push_back最后追加更多元素。有关 std::vector 构造函数的更多信息,请参阅this page

【讨论】:

    【解决方案2】:

    替换 vector&lt;int&gt; list3(list1.size()+list2.size());

    vector&lt;int&gt; list3;

    当你用 X 的大小初始化向量时,你将有 X 元素的值为 0。然后你使用 list3.push_back(Y); 它将元素 Y 添加到向量的末尾。 如果您声明一个空向量并使用list3.push_back(Y);,那么向量中将只有一个元素 Y。

    【讨论】:

      【解决方案3】:

      线

      vector<int> list3(list1.size()+list2.size());
      

      创建int 类型的向量并插入list1.size()+list2.size() 默认构造元素。您想创建一个int 类型的空向量并为list1.size()+list2.size() 元素保留内存。使用

      vector<int> list3;
      list3.reserve(list1.size()+list2.size());
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-04
        • 2022-12-13
        • 2013-09-10
        • 1970-01-01
        • 1970-01-01
        • 2016-09-07
        相关资源
        最近更新 更多