#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;
}
我用int L [n1],R [n2];得到了这个合并排序程序。 Visual Studio给我“表达必须具有恒定的价值”。我不知道该怎么做。我也尝试使用矢量,但得到了“表达式:矢量下标超出范围”错误。文本文件中的数字是20个随机数,从5到900未分类。关于如何放置的任何指针都有一个非常数的数组大小?
旁注:我将数组int main设置为20,因为我知道该文件有20个数字。有没有办法设置文件的数组大小我不知道它将包含多少个值?
答案 0 :(得分:1)
您不必预先分配您的矢量。你可以继续添加东西,直到你完成。
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;
}
请注意,std::vector
size()
是从文件中读取的内容。
已添加:当您开始使用标准库中的内容use this site时,看看您可以使用std :: vector之类的内容。它解释了push_back
和size
以及所有其他成员以及功能概述。
戴维斯勒指出。养成不使用标准库using namespace
的习惯。这是不值得的。谷歌在stackoverflow上的更多信息。
答案 1 :(得分:0)
除非它们是编译时已知的常量,否则不能将n1
或n2
用作C ++中的数组边界。如果它们是constexpr
变量,这将有效。
在C中,这些表达式将声明可变长度数组,这是一个可选功能。