假设我有以下 C++ 函数:
// Returns a set containing {1!, 2!, ..., n!}.
set<int> GetFactorials(int n) {
set<int> ret;
int curr = 1;
for (int i = 1; i < n; i++) {
curr *= i;
ret.insert(curr);
}
return ret;
}
set<int> fs = GetFactorials(5);
(这只是一个虚拟示例。关键是该函数自己创建集合并返回它。)
我的一个朋友告诉我,不要像我那样编写函数,我应该编写它以便函数接收指向集合的指针,以避免在返回时复制集合。我猜他的意思是这样的:
void GetFactorials2(int n, set<int>* fs) {
int curr = 1;
for (int i = 1; i < n; i++) {
curr *= i;
fs->insert(curr);
}
}
set<int> fs;
GetFactorials2(5, &fs);
我的问题:第二种方式真的是一个很大的优势吗?这对我来说似乎很奇怪。我是 C++ 新手,对编译器了解不多,但我会假设通过一些编译器魔法,我的原始函数不会贵得多。(而且我会避免自己初始化集合。)我错了吗?关于指针和返回复制我应该知道些什么才能理解这一点?