C++ C++;按引用语法传递的向量

C++ C++;按引用语法传递的向量,c++,vector,reference,C++,Vector,Reference,我在将引用的返回值传递到主函数时遇到问题。代码应该返回用户输入的偶数和奇数。我认为我的语法是错误的 using namespace std; int numOfOddEven(vector<int>); int main () { int numValues, odd; vector<int> values; cout << "Enter number of values: "; cin >> numValues; for(int coun

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

  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;
}
使用名称空间std;
int numfodd偶(向量);
int main()
{
int数值,奇数;
向量值;
cout>numvalue;
for(int count=0;counttempValue;
值。向后推_(tempValue);
}

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

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

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

不需要任何返回。编译器,当它看到AND时,它把它当作指针,但是在代码中,你把它看作一个变量。< /P> < P>你调用错误的参数,使用错误的逻辑

 odd =numOfOddEven(values); //Use values
 cout <<"Odd numbers: " << odd;
 cout <<"Even numbers: " << values.size()- odd; //Get even count using this
另一种方法是使用


我认为这个代码有一些地方是错误的

  • 不能像正在尝试的那样返回两个元素
  • 你没有在任何地方通过引用传递
  • 传递给
    numfoddeven
    的内容不是函数所期望的内容(一个
    int
    与一个
    vector
  • 学习函数如何工作,通过引用实际上意味着什么,什么是<代码>返回<代码>,以及在C++中取一个数模意味着什么。然后尝试再次接近这个。

    代码> int NoNoFoDDEVEN(vector和vECT)
    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;
    }
    
    { int奇数=0; int偶数=0; 对于(int i=0;inumvalue; for(int count=0;counttempValue; 值。向后推_(tempValue); }
    无法解决您的主题中的问题:

    int numOfOddEven(vector<int> vect) { }
    
    int numfodd偶(向量向量){
    
    在向量之前添加(&V):

    int numOfOddEven(vector<int> & vect) { }
    
    int numfodd偶(vector&vect){
    
    然后将通过引用而不是复制来传递vect。对于返回值,请将它们作为引用传入,然后声明void类型的函数:

    void numOfOddEven(vector<int> & vect, int & countodd, int & counteven) { }
    
    void numfodd偶数(vector&vect,int&countodd,int&count偶数){
    

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

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

    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);
        });
    }
    
    如果希望从单个函数调用返回两个值,有几种方法。最简单的方法是返回
    std::pair

    std::pair CountOddsAndEvens(const std::vector&v)
    {
    int evens=std::count_if(v.begin(),v.end(),[](int i)
    {
    返回!(i%2);
    });
    int赔率=v.size()-偶数;
    返回标准::配对(偶数、赔率);
    }
    
    或者,您可以将它们作为输出参数传入:

    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;
    }
    
    void CountOddsAndEvens(const std::vector&v,int&evens,int&赔率)
    {
    evens=std::count_if(v.begin(),v.end(),[](int i)
    {
    返回!(i%2);
    });
    赔率=v.size()-偶数;
    }
    
    这两种情况都需要您对当前的输出调用进行更改:

    std::pair<int, int> results = CountOddsAndEvens(values);
    std::cout << "Odds = " << results.second << ", Evens = " << results.first << std::endl;
    
    std::pair results=CountOddsAndEvens(值);
    
    std::cout首先要看的是声明:

    int numOfOddEven(vector<int>);
    
    然后,在函数结束时,您可以返回
    returnmake\u pair(num\u赔率,num\u evens)
    。然后,您还需要执行类似操作以实际接受返回的值:

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

    但是对于初学者来说,这可能太复杂了。您希望找到另一种迂回的方法从一个函数调用中“返回”两个数字

    void numOfOddEven(vector<int>, int&, int&);
    
    void numfodd偶(vector,int&,int&);
    
    请注意,返回类型不是
    void
    。此函数实际上并不
    返回任何内容。但是您可以通过引用传入两个变量
    奇数
    偶数
    。当您说“通过引用传递”时,这可能就是您的意思

    …需要更多代码…[社区wiki:-)]



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

    你认为
    返回奇数;返回偶数;
    可以做什么?1.这里没有通过引用传递的内容。2.多个返回语句是无用的。将
    if(i/2==1)
    更改为
    if(vect[i]%2==0)
    ,除了所有其他错误之外……在你的
    答案中没有任何错误之前,你也有看起来不合适的
    ,但不清楚这与原始问题的联系。
    当它看到&,它认为它是一个指针
    @Aaron-这家伙在问他为什么不能通过引用(因此,2在体内返回)。我正试图向他解释,他需要那个特定的语法,并且不需要返回来通过引用传递。我是否理解错了这个问题?@Zac-这是一个过度简化的问题。这只是因为我注意到了是谁提出了这个问题。在进入细节之前,你必须在简单的基础上再接再厉。不过,你很好地为其他人指出了这一点。=)欢迎来到stack overflow!感谢您的回答!在这里,我们试图解释我们的答案,以便OP(以及任何未来的Google用户)能够理解真正了解他们的问题和解决方案,而不仅仅是一堆他们可以复制和粘贴的代码。如果您能在回答中添加一些文本来解释解决方案的工作原理和原因,我们将不胜感激。:)您计算赔率和偶数的逻辑是错误的:
    vect[i]%2==1
    对于奇数将为
    true
    ,对于偶数将为
    false
    。如果不打算对偶数做任何处理,则计数偶数是没有意义的
    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;
    
    int numOfOddEven(vector<int>);
    
    pair<int,int> numOfOddEven(vector<int>);
    
    tie(odd, even) = numOfOddEven(values);
    
    void numOfOddEven(vector<int>, int&, int&);