我正在研究LIST并使用功能,这个程序给出10个数字,如果输入的数字大于我们列表中的最大值,那么这个数字将被添加到我们的列表中,最后在10次尝试之后所有成员会出现。该计划工作正常,但我不明白为什么我需要使用"&"在第6行:" void insertMax(list& lst,int n){" ??
#include <iostream>
#include <list>
using namespace std;
void insertMax(list<int> &lst, int n) {
lst.sort();
int max = lst.back();
if (n > max) {
lst.push_back(n);
}
}
void disply(list<int> lst) {
list<int>::iterator iter = lst.begin();
while (iter!=lst.end()){
cout << *iter << endl;
iter++;
}
}
int main()
{
list<int> numbers;
numbers.push_back(0);
int input=0;
for (int j = 1; j < 11; j++){
cout << "Enter a number: " << endl;
cin >> input;
insertMax(numbers, input);
}
cout << "Now that's all: " << endl;
disply(numbers);
return 0;
}
提前致谢。
答案 0 :(得分:2)
所以你传递了对列表的引用而不是它的副本。
Google&#34;通过引用传递&#34;和&#34;传递价值&#34;。
通过引用传递意味着您不必复制您传递的整个数据结构(这可能很慢 - 特别是如果您有一个大清单)
话虽如此,你的疑问并不十分清楚:&#34;为什么&amp;在拨打此列表时需要?&#34; - 第6行不是通话,它是功能签名的声明。所以它说'#34;当你给我打电话时,我希望你把一个引用列表提交给#34;
答案 1 :(得分:1)
通过放入&符号(&amp;),您可以指定将列表作为参考,而不是将其复制到函数范围中。通过将其作为参考,您可以操纵外部对象。 http://www.cprogramming.com/tutorial/references.html
答案 2 :(得分:0)
如果您不添加'&amp;' (通过引用传递),您对InsertMax函数中的List所做的任何更改都不会影响main方法中的列表。
这就是为什么你有时会看到声明为
的C ++方法签名的原因void DoSomething(const std::string &value)
{
/*Method Body*/
}
这样做是为了使value
字符串中的所有数据都不会复制到内存中的新位置。如果DoSomething
方法需要修改值字符串,则需要首先在函数内部复制它。 const
修饰符确保该方法的引用是只读的。
例如:
std::string DoSomething(const std::string &value)
{
std:string result = value + "some other data";
return result;
}
答案 3 :(得分:0)
如果我理解正确,第6行是函数定义的起始行
void insertMax(list<int> &lst, int n) {
lst.sort();
int max = lst.back();
if (n > max) {
lst.push_back(n);
}
}
第一个参数声明中的符号&
表示该参数将是原始参数的refence。因此,函数中列表的任何更改都会影响原始参数。
如果要移除此符号&
,例如
void insertMax(list<int> lst, int n) {
//...
这意味着该函数将处理原始参数的副本。在这种情况下,参数副本的参数的任何更改都不会影响原始参数。
因此新项目将添加到列表的副本中,但列表本身不会更改。它的副本将被更改。