C ++向量通过引用语法传递

时间:2013-10-31 18:41:03

标签: c++ vector reference

我遇到的问题是将我的引用的返回值传递给main函数。代码应该返回用户输入的偶数和奇数的数量。我认为我在传递中的语法是错误的。

  using namespace std;

int numOfOddEven(vector<int>);
int main ()
{
int numValues, odd;
vector<int> values;
cout << "Enter number of values: ";
cin >> numValues;

for(int count = 0; count < numValues; count++)
{
    int tempValue;
    cout << "Enter value: ";
    cin >> tempValue;
    values.push_back(tempValue);
}

 cout <<"Odd numbers: " << numOfOddEven(odd);
}cout <<"Even numbers: " << numOfOddEven(even);


int numOfOddEven(vector<int> vect)
{
int odd = 0;
int even = 0;

for (int i = 0; i < vect.size(); i++)
    if (i/2 == 1 )
        ++even;
    else
        ++odd;

return odd;
return even;
}

7 个答案:

答案 0 :(得分:4)

我在这段代码中看到的一些错误

  1. 你不能像你正在尝试的那样返回两个元素
  2. 您不是通过任何地方的参考传递
  3. 您传递给numofOddEven的内容不是该功能所期望的(intvector
  4. 了解函数如何工作,参考传递实际意味着什么,return做什么,以及在c ++中取数字模数的含义。然后再尝试接近这个。

答案 1 :(得分:1)

您使用错误的参数调用并使用错误的逻辑

 odd =numOfOddEven(values); //Use values
 cout <<"Odd numbers: " << odd;
 cout <<"Even numbers: " << values.size()- odd; //Get even count using this

numOfOddEven中,只需返回odd点数

修复逻辑: -

int numOfOddEven(vector<int> vect)
{
int odd = 0;
//int even = 0;

for (int i = 0; i < vect.size(); i++)
    if (vect[i]%2 != 0 )
        ++odd;

return odd;
 //return even;
}

另一种方法是使用std::count_if

int numodd = std::count_if(values.begin(), values.end(), 
                      [](int i) {return i % 2 != 0;});
int numeven = values.size() - numodd ;

答案 2 :(得分:1)

int numOfOddEven(vector<int> & vect)
{
int odd = 0;
int even = 0;

for (int i = 0; i < vect.size(); i++)
    if (vect[i]%2 == 1 )
        ++even;
    else
        ++odd;

return odd;

}


int main ()
{
int numValues, odd;
vector<int> values;
cout << "Enter number of values: ";
cin >> numValues;

for(int count = 0; count < numValues; count++)
{
    int tempValue;
    cout << "Enter value: ";
    cin >> tempValue;
    values.push_back(tempValue);
}

 cout <<"Odd numbers: " << numOfOddEven(values);
 cout <<"Even numbers: " << numValues - numOfOddEven(values);
 cin.get();
 cin.get();
 return 0;
}

答案 3 :(得分:0)

引用在函数声明/签名中定义。例如:

void fct( int &ref1, int &ref2)
{
   ref1 = 1;
   ref2 = 2;
}

int ref1, ref2;
fct(ref1, ref2);

无需任何退货。编译器在看到&amp;时,会将其视为指针,但在代码中,您将其视为变量。

答案 4 :(得分:0)

解决主题中的问题:

int numOfOddEven(vector<int> vect) { }

添加&amp;在vect之前:

int numOfOddEven(vector<int> & vect) { }

然后vect将通过引用传递而不是复制。关于返回值,也将它们作为引用传入,然后声明类型为void的函数

void numOfOddEven(vector<int> & vect, int & countodd, int & counteven) { }

然后只修改函数中的那些变量,不要返回任何内容。

答案 5 :(得分:0)

首先,您没有在现有代码中通过引用传递任何内容。如果你想通过引用传递向量,你需要声明你的函数:

int OddCount(const std::vector<int>& v)
// ................................^ That denotes a reference
{
    return std::count_if(v.begin(), v.end(), [](int i)
    {
        return i % 2;
    });
}

int EvenCount(const std::vector<int>& v)
{
    return std::count_if(v.begin(), v.end(), [](int i)
    {
        return !(i % 2);
    });
}

注意:确定奇数/偶数的逻辑在上述两个函数中都是固定的。你的方法不正确(除非你认为2是唯一的偶数)。

其次,你从未声明过even向量(并且没有必要,也没有必要声明odd向量)。所以你应该修改输出语句:

cout << "Odd Numbers:  " << OddCount(values) << std::endl;
cout << "Even Numbers: " << EvenCount(values) << std::endl;

如果您希望从单个函数调用返回两个值,则有几种方法可以执行此操作。 “最简单”的方法是返回std::pair<int, int>

std::pair<int, int> CountOddsAndEvens(const std::vector<int>& v)
{
    int evens = std::count_if(v.begin(), v.end(), [](int i)
        {
            return !(i % 2);
        });

    int odds = v.size() - evens;

    return std::make_pair(evens, odds);
}

或者,您可以将它们作为输出参数传递:

void CountOddsAndEvens(const std::vector<int>& v, int& evens, int& odds)
{
    evens = std::count_if(v.begin(), v.end(), [](int i)
        {
            return !(i % 2);
        });

    odds = v.size() - evens;
}

这两个都需要您更改当前的输出调用:

std::pair<int, int> results = CountOddsAndEvens(values);
std::cout << "Odds = " << results.second << ", Evens = " << results.first << std::endl;

或者

int evens, odds;
CountOddsAndEvens(values, evens, odds);
std::cout << "Odds = " << odds << ", Evens = " << evens << std::endl;

答案 6 :(得分:0)

首先要看的是宣言:

int numOfOddEven(vector<int>);

这会返回一个int,而不是两个。如果要返回两条(独立的)信息,则必须更改某些内容。如果要返回两个整数,可以编写一个具有此类型的函数:

pair<int,int> numOfOddEven(vector<int>);

然后,在函数结束时,您可以使用return make_pair(num_odds, num_evens)返回。然后,您还需要执行类似的操作以实际接受返回的值:

tie(odd, even) = numOfOddEven(values);

但是,这对于初学者来说可能太复杂了。你想找到另一种环形交叉路,从一个函数调用中“返回”两个数字。

void numOfOddEven(vector<int>, int&, int&);

请注意,返回类型不是void。这个函数实际上并不是return。但是,您可以通过引用传递两个变量oddeven。当你说“通过参考传递”时,这可能是你的意思。

...需要更多代码... [community-wiki :-)]


但是,再次!很明显,每个数字都是奇数或偶数。因此,只返回一个数字odd即可。然后你可以计算(在main内)偶数的数量就是向量的总大小减去奇数的数量。