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

Posted

技术标签:

【中文标题】C++ 向量通过引用语法传递【英文标题】:C++ Vectors Passing by Reference Syntax 【发布时间】:2013-10-31 18:41:02 【问题描述】:

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

  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;

【问题讨论】:

你认为return odd;return even;会做什么? 1.这里没有通过引用传递任何内容。 2.多个return语句没用。 if (i/2 == 1 )改成if(vect[i]%2==0),除了所有其他错误... 您的cout &lt;&lt;"Even numbers: " 之前还有看起来像和不合适的,这将它放在main 之外。不好。 【参考方案1】:

我认为这段代码有很多问题

    您不能像尝试那样返回两个元素 您没有在任何地方通过引用传递 您传递给 numofOddEven 的不是函数所期望的(intvector

了解函数的工作原理、按引用传递的实际含义、return 的作用以及取模数在 c++ 中的含义。然后尝试再次接近这个。

【讨论】:

【参考方案2】:

你使用错误的参数和错误的逻辑调用

 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 ;

【讨论】:

【参考方案3】:
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;

【讨论】:

欢迎堆栈溢出!感谢您的回答!在 SO,我们尝试解释我们的答案,以便 OP(以及任何未来的谷歌员工)真正了解他们的问题和解决方案,而不是仅仅拥有一堆可以复制和粘贴的代码。如果您在答案中添加一些文字来解释您的解决方案如何工作以及为什么工作,我们将不胜感激。 :) 您计算赔率和偶数的逻辑是错误的:vect[i]%2 == 1 将是 true 用于 odd 数字,false 用于 even数字。即使你不打算对它们做任何事情,计数也是没有意义的。 哈哈 反正我也不知道作者想干什么,就是想帮忙。在我看来,在这种情况下没有必要使用参考。抱歉没有评论,今天早上有点忙其他事情。【参考方案4】:

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

void fct( int &ref1, int &ref2)

   ref1 = 1;
   ref2 = 2;


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

无需任何退货。编译器,当它看到 & 时,它认为它是一个指针,但在代码中,你认为它是一个变量。

【讨论】:

这个答案没有什么不正确的,但不清楚这与原始问题有何联系。 when it sees the &amp;, it considers it as a pointer @Aaron - 这家伙在问为什么他不能通过引用传递(因此 2 在体内返回)。我试图向他解释他需要那种特定的语法并且没有返回通过引用传递。我是不是把问题理解错了? @Zac - 过于简单化了。那只是我在注意谁问了这个问题。在进入细节之前,你必须建立在简单的东西上。不过,您确实为其他人指出了这一点。 =)【参考方案5】:

解决您的主题中的问题:

int numOfOddEven(vector<int> vect)  

在 vect 之前添加 & :

int numOfOddEven(vector<int> & vect)  

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

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

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

【讨论】:

【参考方案6】:

首先要看的是声明:

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 任何东西。但是您可以通过引用 this 传入您的两个变量 oddeven。当您说“通过引用传递”时,可能就是这个意思。

...需要更多代码... [社区维基 :-)]


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

【讨论】:

【参考方案7】:

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

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&lt;int, int&gt;:

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;

【讨论】:

以上是关于C++ 向量通过引用语法传递的主要内容,如果未能解决你的问题,请参考以下文章

C++ 通过引用传递向量字符指针

通过引用传递向量 C++

通过引用传递向量,但更改不会坚持 c++

通过引用传递向量的 typedef 向量

通过引用函数传递向量,但更改不会持续

通过引用传递 - 左值和向量