C++ 合并排序错误-表达式必须具有常量值 #包括“stdafx.h” #包括 #包括 #包括 #包括 #包括 使用名称空间std; 无效合并(int A[],int p,int q,int r){ int i; int j; int k; int n1=q-p+1; int n2=r-q; 向量L(n1),R(n2); 对于(i=0;i CONTXPRP变量”,那么这将起作用。

C++ 合并排序错误-表达式必须具有常量值 #包括“stdafx.h” #包括 #包括 #包括 #包括 #包括 使用名称空间std; 无效合并(int A[],int p,int q,int r){ int i; int j; int k; int n1=q-p+1; int n2=r-q; 向量L(n1),R(n2); 对于(i=0;i CONTXPRP变量”,那么这将起作用。,c++,C++,我得到了这个带有int L[n1],R[n2];;的合并排序程序。Visual studio给了我“表达式必须有一个常量值”。我不知道该怎么办。我也尝试过使用向量,但得到了“表达式:向量下标超出范围”错误。文本文件中的数字是从5到900的20个随机数,未排序。有没有关于如何放置数组大小的非常量数字的指针 旁注:我将数组int main设置为20,因为我知道该文件有20个数字。有没有办法为一个文件设置数组大小?我不知道其中将包含多少值?您不必预先分配向量。您可以继续添加内容,直到完成为止 #inc

我得到了这个带有int L[n1],R[n2];;的合并排序程序。Visual studio给了我“表达式必须有一个常量值”。我不知道该怎么办。我也尝试过使用向量,但得到了“表达式:向量下标超出范围”错误。文本文件中的数字是从5到900的20个随机数,未排序。有没有关于如何放置数组大小的非常量数字的指针


旁注:我将数组int main设置为20,因为我知道该文件有20个数字。有没有办法为一个文件设置数组大小?我不知道其中将包含多少值?

您不必预先分配向量。您可以继续添加内容,直到完成为止

#include "stdafx.h"
#include <iostream>
#include <stdio.h>
#include <fstream>
#include <stdlib.h>
#include <vector>

using namespace std;

void merge(int A[], int p, int q, int r) {
    int i;
    int j;
    int k;
    int n1 = q - p + 1;
    int n2 = r - q;
    vector<int> L(n1), R(n2);
    for (i = 0; i < n1; i++)
        L[i] = A[p + i - 1];
    for (j = 0; j < n2; j++)
        R[j] = A[q + j];
    i = 1;
    j = 1;
    for (k = p ; k < r; k++) {
        if (L[i] <= R[j]) {
            A[k] = L[i];
            i++;
        }else{
            A[k] = R[j];
            j++;
        }
    }   
}
void merges(int A[], int p, int r) {
    if (p < r) {
        int q = (p + r) / 2;
        merges(A, p, q);
        merges(A, q + 1, r);
        merge(A, p, q, r);
     }
}
void prin(int A[], int n) {
     int j;
     for (j = 0; j < n; j++)
        printf("%d ", A[j]);
     printf("\n");
}
int main(){
    fstream infile;
    infile.open("number.txt");
    if (infile.is_open()) {
        int i;
        int A[20];
        int n = sizeof(A) / sizeof(*A);
        int p = 0;
        for (int i = 0; i < n; i++) {
            infile >> A[i];
        }
        for (int j = 0; j < n; j++) {
            if (A[j] > p)
                p = A[j];
        }
        merges(A, 0, n);
        prin(A, n); 
    }
    return 0;
}
intmain()
{
std::ifstream文件;
打开(“TextFile1.txt”);
std::字符串str;
std::vectorstrs;
对于(;std::getline(文件,str);)
标准后推(str);

STD::CUT< P>不能使用<代码> Nav<代码>或<代码> N2<代码>作为C++中的数组边界,除非它们是编译时已知的常数。如果它们是“代码> CONTXPRP</CARD>变量”,那么这将起作用。


在C语言中,这些表达式将声明可变长度数组,这是一项可选功能。

您已经找到了使用可变元素数的数组的解决方案-它是
std::vector
。不过,您仍然需要获得正确的大小。此外,
使用命名空间std;
被认为是有害的:您最好编写
std::vector
。一堆旧代码定义了其他名为
vector
或特别是
string
的类。使用std::stable\u sort也就是说,最好是
reserve()
尽可能多的空间,以避免可能需要将向量移动到不同的内存块。
int main()
{
    std::ifstream file;
    file.open("TextFile1.txt");
    std::string str;
    std::vector< std::string > strs;
    for( ; std::getline( file, str ); )
        strs.push_back( str );

    std::cout << "the number of entries: " << strs.size( ) << std::endl;
    return 0;
}