簡體   English   中英

C ++中Mergesort的問題

[英]Problem with Mergesort in C++

vector<int>& mergesort(vector<int> &a) {
    if (a.size() == 1) return a;
    int middle = a.size() / 2;
    vector<int>::const_iterator first = a.begin();
    vector<int>::const_iterator mid = a.begin() + (middle - 1);
    vector<int>::const_iterator last = a.end();
    vector<int> ll(first, mid);
    vector<int> rr(mid, last);

    vector<int> l = mergesort(ll);
    vector<int> r = mergesort(rr);
    vector<int> result;
    result.reserve(a.size());
    int dp = 0, lp = 0, rp = 0;

    while (dp < a.size()) {
        if (lp == l.size()) {
            result[dp] = (r[rp]);
            rp++;
        } else if (rp == r.size()) {
            result[dp] = (l[lp]);
            lp++;
        } else if (l[lp] < r[rp]) {
            result[dp] = (l[lp]);
            lp++;
        } else {
            result[dp] = (r[rp]);
            rp++;
        }
        dp++;
    }
    a = result;
    return a;
}

它正確編譯但在執行時,我得到:

此應用程序已請求運行時以不尋常的方式結束它。

這是一個奇怪的錯誤。

這些代碼是否存在根本錯誤?

這個result.reserve(a.size())只影響向量的容量 ,而不是它的大小 (向量的容量告訴向量可以增長到哪個大小而無需重新分配和復制所有成員。基本上它只用於優化目的。)在預留之后你不能訪問result任何成員,因為沒有任何成員。 使用result.push_back(...)而不是result[dp] = ...result.resize(a.size())而不是result.reserve(a.size())

我想前者可能更有效。

一個問題是使用reserve() (使用resize()或使用push_back()附加項而不是訪問索引)。


if (a.size() == 1) return a;
int middle = a.size() / 2;
vector<int>::const_iterator first = a.begin();
vector<int>::const_iterator mid = a.begin() + (middle - 1);
vector<int>::const_iterator last = a.end();
vector<int> ll(first, mid);
vector<int> rr(mid, last);

這可能是另一個問題。 如果大小為2,則ll最終將成為空向量,並且此函數似乎不會處理此問題。 無論如何,似乎沒有太多理由從中間減去1。


也有可能你復制的東西遠遠超過需要:你不應該需要lr向量(因為它們只是llrr副本),同樣我認為你不需要result向量,因為你可以只寫結果合並后馬上回a

reserve()不會更改向量中的內容量。 你已經創建了一個空向量,為它保留了一定的大小,然后用v [i] = x; 這不是向量的有效使用,因為向量中仍然沒有任何第i個元素。

請改用resize()。

錯誤消息非常不清楚,因為當異常未處理時,它是VC ++的標准消息。 您可以在main中添加try-catch-clock以獲取異常並產生更有意義的錯誤:

int main() {
    try {
        // do main stuff here
    }
    catch ( std::exception & e ) {
        std::cout << e.what() << std::endl;
    }
}

這是針對命令行的。 如果您的應用程序沒有,請使用消息框或將錯誤寫入日志文件。

關於代碼中的問題,所有其他答案似乎都是正確的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM