3 回答

TA貢獻(xiàn)1863條經(jīng)驗(yàn) 獲得超2個(gè)贊
如果您使用向量訪問(wèn)向量中的元素,則[]
可能會(huì)遇到段錯(cuò)誤。這段代碼,
vector <int> a;
給你一個(gè)空向量。
a[0]
如果什么都沒(méi)有,問(wèn)問(wèn)就行不通a
。嘗試將其設(shè)置a[0]
為一個(gè)值也不起作用。它不存在。然而。
您在mergeSort
使用時(shí)遇到類似的問(wèn)題
vector <int> l, r;
這些也是空向量。
您可以使用push_back
(甚至emplace_back
)添加新元素?;蚴褂脴?gòu)造函數(shù)重載來(lái)聲明所需的元素?cái)?shù)量。例如,
vector <int> a(10);
給您一個(gè)十個(gè)整數(shù)的向量,因此a[0]
可以讀取或?qū)懭搿?nbsp;a[11]
不是。
首先練習(xí)使用向量,然后嘗試合并排序。

TA貢獻(xiàn)1803條經(jīng)驗(yàn) 獲得超3個(gè)贊
出現(xiàn)分段錯(cuò)誤的原因是您訪問(wèn)了不存在的內(nèi)存位置(更準(zhǔn)確地說(shuō)是未分配)。假設(shè)您有一個(gè)長(zhǎng)度為3的向量,并且嘗試訪問(wèn)第4個(gè)位置,則會(huì)遇到分割錯(cuò)誤。
與@doctorlove的答案相反,我想說(shuō)可以使用[]。但是,您需要以下實(shí)現(xiàn)(僅針對(duì)main(),請(qǐng)?jiān)谄渌δ苤幸韵嗤倪壿媽?shí)現(xiàn))。有關(guān)std::vector更多信息,請(qǐng)參見(jiàn)的文檔。
int main()
{
size_t n;
std::cin >> n;
std::vector <int> a(n);
for(int i=0;i<n;++i)
{
std::cin >> a[i];
}
// mergeSort(a);
for(int i=0;i<n;++i)
{
std::cout << a[i] << "\n";
}
return 0;
}
希望這可以幫助。干杯。

TA貢獻(xiàn)1790條經(jīng)驗(yàn) 獲得超9個(gè)贊
這是更改后的最終代碼:
//merging 2 sorted subarrays.
#include <iostream>
#include <vector>
using namespace std;
void merge(vector <int> &a,vector <int> &b,vector <int> &c)
{
int i=0,j=0,k=0,bL=b.size(),cL=c.size();
while(i<bL && j<cL)
{
if(b[i]<c[j])
{
a[k]=b[i];
i++;k++;
}
else
{
a[k]=c[j];
j++;k++;
}
}
while(i<bL)
{
a[k]=b[i];
i++;k++;
}
while(j<cL)
{
a[k]=c[j];
j++;k++;
}
cout<<"array a inside merge is: "<<endl;
for(int p=0;p<a.size();p++)
{
cout<<a[p]<<endl;
}
}
void mergeSort(vector <int> &a)
{
vector <int> l, r;
int mid;
if(a.size()<2) return;
mid = a.size()/2;
for(int i=0;i<mid;i++)
{
l.push_back(a[i]);
}
//change2
for(int i=0;i<a.size()-mid;i++)
{
r.push_back(a[mid+i]);
}
mergeSort(l);
mergeSort(r);
merge(a, l, r);
}
int main()
{
int n;
cin>>n;
//change1
vector <int> a(n);
for(int i=0;i<n;i++)
{
cin>>a[i];
}
mergeSort(a);
cout<<"Final array is:"<<endl;
for(int p=0;p<n;p++)
{
cout<<a[p]<<endl;
}
return 0;
}
添加回答
舉報(bào)