我正在嘗試創建一個排序函式,其引數是串列的指標,并且我正在嘗試訪問給定串列的元素。希望這段代碼比我能更好地說明問題:
void bubbleSort(std::vector<int> *L) {
unsigned int i = 0; int temp;
while(isSorted(*L)) {
if(i==L->size()-1) {
i = 0;
}
if(i<L[i]/*<-ERROR here.*/) {
temp = L[i 1]; // ERROR HERE
L[i 1] = L[i]; // ERROR HERE
L[i] = temp; // ERROR HERE
}
}
}
uj5u.com熱心網友回復:
您不需要痛苦地取消對每個單獨使用的參考L(實際上這樣做很容易出錯,正如您在答案中遺漏了一個所證明的那樣)。
相反,只需撰寫:
void bubbleSort(std::vector<int> *Lptr) {
auto &L = *Lptr;
并保持其余代碼相同。
注意。最好將函式本身更改為
void bubbleSort(std::vector<int> &L) {
因為它應該首先撰寫,但我假設有一些人為的原因你不能這樣做。
uj5u.com熱心網友回復:
該函式接受指向型別物件的指標std::vector<int>。
void bubbleSort(std::vector<int> *L) {
要使用指標訪問原始向量,您可以撰寫*L或L[0]。也就是說,兩個運算式都會產生一個型別std::vector<int> &為向量的左值參考。
要i-th通過指標使用下標運算子獲取向量的元素,可以撰寫(*L)[i]或L[0][i],
但是,在此if宣告中:
if(i<L[i]/*<-ERROR here.*/) {
您正在嘗試將 type 的變數i與 typeunsigned int的物件L[i]進行比較std::vector<int>。當i不等于 時0,這會產生一個不存在的向量型別物件。
看來您的意思類似于以下內容:
if ( (*L)[i] < (*L)[i 1] ) {
或者:
if ( L[0][i] < L[0][i 1] ) {
或相反亦然:
if ( L[0][i 1] < L[0][i] ) {
取決于向量是按升序還是降序排序。
請注意,將引數宣告為指向 a 的指標是沒有意義的std::vector<int>。如果它通過參考接受向量,則該函式將更加清晰和可讀:
void bubbleSort(std::vector<int> &L) {
在這種情況下,if陳述句將如下所示:
if ( L[i] < L[i 1] ) {
uj5u.com熱心網友回復:
盡管我更喜歡將源代碼更改為其他答案。但是,對于這個問題,您可以使用->at()函式來訪問向量指標中的元素。
if(i<L->at(i)) {
temp = L->at(i 1);
L->at(i 1) = L->at(i);
L->at(i) = temp;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/490439.html
