在练习编写合并两个列表的算法时遇到一些问题。
#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
答案 0 :(得分:1)
vector<int> list3(list1.size()+list2.size());
应该是
vector<int> list3;
第一个构造函数使用N + M个元素初始化向量,所有元素都初始化为0,并且push_back
在末尾附加更多元素。有关std :: vector构造函数的更多信息,请参见this page。
答案 1 :(得分:0)
替换
vector<int> list3(list1.size()+list2.size())
;
与vector<int> list3;
初始化大小为X的Vector时,将具有X元素,其值为0。然后使用list3.push_back(Y);
,它将在向量的末尾添加元素Y。
如果您声明一个空向量并使用list3.push_back(Y);
,则向量中将只有一个元素Y。
答案 2 :(得分:0)
行
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());