关于合并两个列表的算法的一些问题

Some problem about the algorithm of merging two lists

本文关键字:算法 问题 列表 于合并 合并 两个      更新时间:2023-10-16

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

#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

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

应该是

vector<int> list3;

第一个构造函数使用 N+M 个元素初始化向量,所有元素都初始化为 0,push_back末尾附加更多元素。有关 std::vector 构造函数的更多信息,请参阅此页面。

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());

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

vector<int> list3;

当您初始化大小为 X

的 Vector 时,您将拥有值为 0 的 X 元素。然后你使用list3.push_back(Y);它将在向量的末尾添加元素 Y。如果声明一个空向量并使用list3.push_back(Y);则向量中只有一个元素 Y。