- 注意:看来代码本身不是问题,而是链接/编译器的问题。第一个代码块位于名为 mesorti.cpp 的文件中。函数 merge 和 mesort 都在那里。编译它的命令是:
g++ -Wall -Wextra -I。 -std=c++11 -fpermissive -c -o mesorti.o mesorti.cpp
g++ -Wall -Wextra -I。 -std=c++11 -fpermissive -o 1 main.o mesorti.o
我已经按原样复制了文件 mesorti.cpp。
下面的函数应该使用一个 vector ,然后对它进行排序。我已经创建了它,以便它应该 对 vector 进行排序,并返回它对它进行排序所花费的时间。但它没有返回排序后的数组,所花费的时间表明它确实甚至没有对它进行排序。函数本身确实有效,(在函数内部指定时它对本地数组进行排序)所以这与参数传递有关。
这是函数,它是一个归并排序算法,递归调用自身并使用另一个函数,merge:
#include <inc.h>
void merge(vector<int>& array, vector<int>& array1, vector<int>& array2)
{
array.clear();
int i, j, k;
for( i = 0, j = 0, k = 0; i < array1.size() && j < array2.size(); k++)
{
if(array1.at(i) <= array2.at(j))
{
array.push_back(array1.at(i));
i++;
} else if(array1.at(i) > array2.at(j))
{
array.push_back(array2.at(j));
j++;
}
k++;
}
while(i < array1.size())
{
array.push_back(array1.at(i));
i++;
}
while(j < array2.size())
{
array.push_back(array2.at(j));
j++;
}
}
double mesorti(intv &array)
{
auto t0 =chrono::high_resolution_clock::now();
if (1 < array.size())
{
intv array1(array.begin(), array.begin() + array.size() / 2);
mesorti(array1);
cout<<"wola";
intv array2(array.begin() + array.size() / 2, array.end());
mesorti(array2);
merge(array, array1, array2);
}
auto t1 = chrono::high_resolution_clock::now();
double T = chrono::duration_cast<chrono::nanoseconds>(t1-t0).count();
return T;
}
这是main的一部分:
#include <iostream>
#include <vector>
#include <chrono>
using namespace std;
typedef vector<int> intv;
typedef vector<float> flov;
typedef vector<double> douv;
double mesorti(intv &vii);
int main()
{
size_t t;
int i;
intv vi;
cout << "Size: \n";
cin >> t;
vi=vectori(0,t); // This function creates a vector.
for(i=0; i<t; ++i)
{
cout << vi[i] <<"\n";
}
time=mesorti(vi);
for(i=0; i<t; ++i)
{
cout << vi[i] <<"\n";
}
}
但这不是对数组进行排序,最后一个 cout 只是返回相同的数组,我通过引用传递它,它不应该工作吗?
最佳答案
您的代码没有任何问题。尝试将您的 main 重写为:
int main() {
intv vi { 3, 2, 1, 5, 4 };
size_t t = vi.size();
int i;
cout << "Original: \n";
for(i=0; i<t; ++i) cout << vi[i] << ' ';
cout << '\n';
double time=mesorti(vi);
cout << "Sorted: \n";
for(i=0; i<t; ++i) cout << vi[i] << ' ';
cout << '\n';
return 0;
}
如果您仍然遇到问题,则可能是链接问题(例如链接到旧的 .o
文件。)
输出:
Original:
3 2 1 5 4
Sorted:
1 2 3 4 5
注意:为简单起见,我使用了 C++11 风格的 vector 初始化。如果您没有 C++11 编译器,请以其他方式对其进行初始化。
编辑:这是为我编译和运行的完整的单文件 main.cpp
文件:
#include <iostream>
#include <vector>
#include <chrono>
using namespace std;
typedef vector<int> intv;
typedef vector<float> flov;
typedef vector<double> douv;
void merge(vector<int>& array, vector<int>& array1, vector<int>& array2) {
array.clear();
int i, j, k;
for( i = 0, j = 0, k = 0; i < array1.size() && j < array2.size(); k++){
if(array1.at(i) <= array2.at(j)){
array.push_back(array1.at(i));
i++;
}else if(array1.at(i) > array2.at(j)){
array.push_back(array2.at(j));
j++;
}
k++;
}
while(i < array1.size()){
array.push_back(array1.at(i));
i++;
}
while(j < array2.size()){
array.push_back(array2.at(j));
j++;
}
}
double mesorti(intv &array) {
auto t0 =chrono::high_resolution_clock::now();
if (1 < array.size()) {
intv array1(array.begin(), array.begin() + array.size() / 2);
mesorti(array1);
intv array2(array.begin() + array.size() / 2, array.end());
mesorti(array2);
merge(array, array1, array2);
}
auto t1 = chrono::high_resolution_clock::now();
double T = chrono::duration_cast<chrono::nanoseconds>(t1-t0).count();
return T;
}
int main() {
intv vi { 3, 2, 1, 5, 4 };
size_t t = vi.size();
int i;
cout << "Original: \n";
for(i=0; i<t; ++i) cout << vi[i] << ' ';
cout << '\n';
double time=mesorti(vi);
cout << "Sorted: \n";
for(i=0; i<t; ++i) cout << vi[i] << ' ';
cout << '\n';
return 0;
}
关于c++ - 函数不工作,参数传递失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28532960/