矢量,通过引用传递。 [英] vector, pass by reference.

查看:100
本文介绍了矢量,通过引用传递。的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



我已经使用向量编写了下面的代码作为合并排序,它有一个问题。

我通过引用传递向量并在里面更改它们被调用的函数,当调用函数使用向量时,它仍然与我将这些数字输入向量而不做任何更改相同。



  #include     stdafx.h 
#include < vector >
< span class =code-keyword> #include < 使用 namespace std;
void showvector(vector< int> numbers){
for (vector< int> :: iterator i = numbers.begin(); i!= numbers.end(); i ++)
{
cout<< *一世;
if (i!= numbers.end() - 1 )cout<< - ;
}
}

vector< int> getvector(){
vector< int>数字( 0 );
cout<< 请输入您的数字::: \ n''输入任何字符,但数字是输入的结尾'' \
;
int counter = 0 ;
执行 {
int newnumber = 0 ;
cout<< element(<< counter<< )=;
counter ++;
cin>> newnumber;的getchar();
if (cin.good())
numbers.push_back(newnumber);
if (cin.fail()){
cout<< 数字为:;
showvector(数字);
}
} while (cin.good());的getchar();
返回个数字;
}

vector< int> merge(vector< int>& one,vector< int>& two){
cout<< \ nnnaring vector with with; showvector(之一); cout<< 带有向量二的元素; showvector(二); cout<< element(s)\ n;
vector< int> :: iterator j = two.begin();
for (vector< int> :: iterator i = one.begin(); i!= one.end(); i ++){
cout<< 现在比较<< * i<< with<< * J<< ENDL;的getchar();
if (* i> * j){
cout<< 现在正在交换<< * i<< with<< * j<< ENDL ;;
int c = * i;
* i = * j;
* j = c;
j ++;
}
}
cout<< 使用; showvector(二); cout<< 元素返回第一个; showvector(之一); cout<< element(s)\ n;
for (j = two.begin(); j!= two.end(); j ++)
one.push_back(* j) ;
cout<< 现在将排序后的矢量返回为\ n;
showvector(one);
返回一个;
}

void mergesort(vector< int>& numbers){
if (numbers.size()> 1 ){
vector< int> halfone(numbers.begin(),numbers.begin()+ numbers.size()/ 2 );
mergesort(halfone);
vector< int> halftwo(numbers.begin()+ numbers.size()/ 2 ,numbers.end());
mergesort(halftwo);
合并(halfone,halftwo);
}
}

int main(){
vector< int>数字(getvector());
mergesort(数字);
cout<< \ nnumbers是:;
showvector(数字);
getchar();
}

解决方案

那是因为你在 mergesort中创建了一个新的向量



在此函数中;

 void mergesort(vector< int>& numbers)



你没有修改数字的内容,你正在创建两个新的向量,从<$ c复制元素$ c>数字到新的向量。



这就是为什么结果与输入相同。



希望这会有所帮助,

Fredrik


你可能想写:

< pre lang =c ++> void mergesort(vector< int>& numbers)
{
{
...
numbers = 合并(halfone,halftwo);
}
}
< / int>



但是,让我告诉你,将这些向量复制回来将使它成为一个真正低效的排序方式。您最好将指针和元素计数传递给合并函数,而不是复制矢量,并让它对就地元素进行排序。


Hi,
I've written the code below as a merge sort using vectors and it has a problem.
I pass the vectors by reference and change them inside the called function and when the caller function uses the vector it's still the same as I entered those numbers into the vectors without any changes.

#include "stdafx.h"
#include <vector>
#include <iostream>
using namespace std;
void showvector(vector<int> numbers){
	for (vector<int>::iterator i = numbers.begin(); i != numbers.end(); i++)
	{
		cout << *i;
		if (i != numbers.end() - 1)cout << " - ";
	}
}

vector<int> getvector(){
	vector<int> numbers(0);
	cout << "please enter you numbers :::\n''entering any characters but numbers is the end of entry''\n";
	int counter = 0;
	do{
		int newnumber = 0;
		cout << "element(" << counter << ") = ";
		counter++;		
		cin >> newnumber; getchar();
		if (cin.good())
			numbers.push_back(newnumber);
		if (cin.fail()){
			cout << "numbers are :";
			showvector(numbers);
		}
	} while (cin.good()); getchar();
	return numbers;
}

vector<int> merge(vector<int>& one, vector<int>& two){
	cout << "\ncomparing vector one with "; showvector(one); cout << " element(s) with vector two with "; showvector(two); cout << " element(s)\n";
	vector<int>::iterator j = two.begin();
	for (vector<int>::iterator i = one.begin(); i != one.end(); i++){
		cout << "now comparing " << *i << " with " << *j<<endl; getchar();
		if (*i > *j){
			cout << "now exchanging " << *i << " with " << *j << endl;;
			int c = *i;
			*i = *j;
			*j = c;
			j++;
		}
	}
	cout << "pushing vector two with "; showvector(two); cout << " element(s) back to vector one with "; showvector(one); cout << " element(s)\n";
		for (j=two.begin(); j != two.end();j++)
			one.push_back(*j);
		cout << "now returning sorted vector as\n";
	showvector(one);
	return one;
}

void mergesort(vector<int>& numbers){
	if (numbers.size() > 1){		
		vector<int> halfone(numbers.begin(), numbers.begin() + numbers.size() / 2);
		mergesort(halfone);
		vector<int> halftwo(numbers.begin() + numbers.size() / 2, numbers.end());		
		mergesort(halftwo);
		merge(halfone, halftwo);
	}			
}

int main(){
	vector<int> numbers(getvector());	
	mergesort(numbers);
	cout << "\nnumbers are :";
	showvector(numbers);
	getchar();
}

解决方案

That's because you create a new vectors in mergesort.

In this function;

void mergesort(vector<int>& numbers)


you're not modifying the contents of numbers, you're creating two new vectors, copying the elements from numbers over to the new vectors.

This is why the result is the same as the input.

Hope this helps,
Fredrik


You probably meant to write:

void mergesort(vector<int>& numbers)
{
        {
                ...
		numbers = merge(halfone, halftwo);
	}			
}
</int>


But let me tell you that copying those vectors back an forth will make it a really inefficient way of sorting. Instead of copying vectors you better pass pointers and element counts to your merge function and let it sort the elements in-place.


这篇关于矢量,通过引用传递。的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆