矢量参考究竟是什么
What exactly is a vector reference?
如果函数接受参数vector<int>&
,这到底意味着什么?这与表示向量中包含的指针的值相同吗?我完全理解vector<int&>
;只是关于&
在外面的一些事情让我绊倒了。
vector<int>&
是一个向量的引用,vector<int&>
是int引用的向量,实际上vector<int&>
根本不会编译,更详细:为什么可以';我不做一个参考向量吗?
如果没有&
,矢量的副本将传递给函数
=所有元素的副本。更改/插入/删除。。。不会影响原始矢量
(如果你有一个指针向量或类似的东西,它们仍然会指向同一个东西,但指针本身也会被复制(。
使用&
,您将在函数中拥有相同的矢量,所有修改也将在外部可见。此外,如果不必要的话,不复制所有内容可能会更快(可能是因为整个move语义&co主题(。
它是一个引用,其中被引用的对象的类型为vector<int>
。
除了类型之外,这与任何其他引用都是一样的。如果你不熟悉引用,它们是为同一变量提供多个标签的一种方式:
int a = 5;
int &b = a;
// now "a" and "b" are both labels for the same variable. any
// expression involving `a` can have that exchanged for `b`
// without making any difference.
a = 6;
std::cout << b << std::endl; // 6
在您谈论的情况下:
void func( vector<int> &b ) { b.push_back(6); }
int main()
{
vector<int> a;
func(a);
std::cout << a[0] << std::endl; // 6
}
则意味着CCD_ 10和CCD_。
我完全理解
vector<int&>
vector<int&>
是非法的,所以希望你对此的"完全理解"是非法的。不可能有引用的数组或容器。
当一个函数接受一个"vector&"时,它被称为通过引用传递。假设您的向量参考参数命名为vec。假设您希望将0赋给int向量中的所有元素。您可以键入:
int assign_zero(vector<int> vec){
for(auto &x : vec){
x = 0;
}
}
有了这个,你可以在你的主要方法中键入这样的东西:
originalVector = assign_zero(originalVector);
您也可以在函数中使用对向量的引用来完成同样的事情(请注意,该函数现在是无效的(:
void assign_zero(vector<int>& vec){
for(auto &x : vec){
x = 0;
}
}
现在,函数assign_zero((直接修改向量,而不是从内存中的originalVector创建一个新的零向量,然后将其分配回originalVector。这允许您使用这样的函数调用,其中没有创建额外的向量:
assign_zero(originalVector);
请注意,具有向量引用的函数不需要为void。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- C++避免重复声明的语法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- C++关于指针和使用函数将它们启动到堆的行为究竟是什么?
- 究竟是什么设置了_WIN32或_WIN64预处理器?
- 这个给定算法中的"basic operation"究竟是什么
- 关于实施其中之一的CPP,这三个规则究竟是什么?
- OpenGL中的缓冲区究竟是什么?如何使用多个缓冲区来发挥优势
- U0.8、U4.8、U12.8、S0.4、S4.4、S12.4、U8.8等定点表示究竟是什么意思
- SDL2中的渲染器究竟是什么
- 找不到究竟是什么 boost::async
- 究竟是什么.Objective-C中的(点)运算符do
- SFINAE适用的C++11标准中提到的"immediate context"究竟是什么?
- 矢量参考究竟是什么
- Visual C++ 的两阶段模板实例化究竟Microsoft "broken"是什么?
- Boost::thread中的join()究竟是什么?(C++)
- (Visual Studio的)警告C4718究竟是什么