首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C++ 排序入門:變長數組 (VLA) 非標準導致編譯錯誤,改用 vector

     編輯:程式設計疑難解答

錯誤代碼

int n; cin >> n;
int list[n-1]; // 錯誤:C++ 標準不支援變長數組 (VLA)
// 部分編譯器 (GCC) 作為擴展支援,但 MSVC/標準模式報錯

正確做法:`std::vector`

#include 
#include  // std::sort
#include 

int main() {
    int n; std::cin >> n;
    std::vector list(n); // 動態數組,自動管理內存
    for (int i = 0; i < n; ++i) std::cin >> list[i];

    std::sort(list.begin(), list.end()); // O(N log N),比冒泡快得多

    for (int i = 0; i < n; ++i) {
        if (i) std::cout << ' ';
        std::cout << list[i];
    }
    return 0;
}

若必須手寫排序(教學用)

// 冒泡排序修正版
for (int i = 0; i < n - 1; ++i) {
    for (int j = 0; j < n - 1 - i; ++j) { // 邊界修正:j < n-1-i
        if (list[j] > list[j + 1]) {
            std::swap(list[j], list[j + 1]);
        }
    }
}

關鍵知識點

概念說明
VLA (Variable Length Array)C99 標準特性,C++ **從未** 標準化;GCC/Clang 作為擴展支援,MSVC 不支援。
`std::vector`C++ 動態數組首選,RAII 自動釋放,支援隨機訪問、擴容、算法庫配合。
`std::sort`內省排序,平均 O(N log N),生產代碼首選;手寫排序僅為學習算法邏輯。
邊界條件冒泡內層 `j < n-1-i`,避免 `j+1` 越界;外層 `i < n-1` 足夠。

**現代 C++:拒絕 VLA,擁抱 `vector` + `algorithm`,代碼更短、更快、更安全。**

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved