假设我有一个数组 B
,它已经在 C++ 代码中的某处定义和使用。现在,假设我有另一个已定义和初始化的数组 A
。我想创建一个函数 f
来转换 A
(例如,FFT)并且我希望转换的结果分配给 B
(当然,随着A
的转换,B
的值也会发生变化)。我想通过保持语法来完成这一切
B=f(A);
即,不将 B
的地址作为参数传递给 f
。是否可能:
- 没有创建临时文件?
- 创建临时对象,但没有内存泄漏?
谢谢。
编辑:以下答案中提供的解决方案摘要
感谢 RiaD、James Kanze、Shahbaz 和 Razispio 的回答。
我要问的是要求 A
和 B
成为数组类的对象,以获得效率和有效性。此外,在“标准”实现中,例如,使用配备复制构造函数的数组类,B=f(A);
之类的语法将需要创建临时对象。然而,应该提到的是,临时变量不一定是限制,因为许多编译器能够省略额外的临时变量。与此相反,像 f(A,B);
这样的语法会避免临时变量。使用表达式模板的解决方案启用语法B=f(A);
,同时在内部使用f(A,B);
,使使用临时工可以忽略不计。一种有效的替代解决方案是使用移动赋值运算符,例如参见
Move semantics and rvalue references in C++11
有关详细信息,请参阅下面提供的答案。
最佳答案
最简单的方法是使用 std::vector
或 std::array
例子:
vector<int> f(const vector<int>& a) {
return a;
}
b = f(a);
实际上,你不必使用其中一个类来存储,你可以使用你自己的类,它有 operator =
YourClass& operator = (const vector<int>&/* there will be returned value of f, it may be std::array, std::vector or your own class.*/ v) {
//fill it here.
return *this;
}
您也可以为其提供移动构造函数以避免不必要的复制。
例如
class Array {
int* data;
YourClass& operator = (YourClass&& v) {
swap(v.data, data);
}
}
YourClass f(const YourClass& a) {
//
}
Array a,b;
b = f(a);
关于c++ - 实现 B=f(A),使用 B 和 A 数组并且 B 已经定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16254797/