在C++中用operation=vector()指定向量安全吗



初始化后稍后分配向量是否安全。

假设我有一个全局向量变量。但我不想在一开始就初始化这个值。

#include <iostream>
#include <vector>
using namespace std;
vector<int> globalVector;
int myNumber=123;
void setVector()
{
// Is it safe to set the vector as shown below ?
globalVector = vector<int>{1,2,3,4};
}
int main(int, char**) {
setVector();
for (int x=0; x<globalVector.size();x++)
{
cout << "Val = " << globalVector[x] << endl;
}
std::cout << "Hello, world! : " << myNumber << endl;
return 0;
}

在VSCode上,我可以看到一些信息说:

std::vector<int> &std::vector<int>::operator=(std::vector<int> &&__x)

+2个过载

%矢量移动赋值运算符。

参数:__x–相同元素和分配器类型的%向量。__x的内容被移动到这个%向量中(如果分配器允许,则不进行复制(。之后,__x是一个有效但未指定的%向量。是否移动分配器取决于分配器特性。

说明书上写着";移动而不复制";。当程序退出函数setVector时,globalVector会损坏吗?

是的,这是安全的,尽管

  1. 符号globalVector = {1,2,3,4};更清晰。

  2. 这不是线程安全

  3. 除非性能真的很重要,否则请使用globalVector.at(x)而不是globalVector[x],因为对于x的某些值,后者的行为可能是未定义的。在这种特殊情况下,循环的范围会更好:for (auto&& i: globalVector)

描述中说"移动而不复制";。当程序退出函数setVector时,globalVector会损坏吗?

这意味着运算符=在没有复制操作的情况下移动了新矢量的内容。在该操作之后,用于初始化的矢量无效。然而,它不会影响您,因为它是仅用于初始化的对象,因此在初始化之后会被销毁。

是的,它是完全安全的,但我建议您不要使用全局矢量

而是写入

int main() {
std::vector<int> globalVector = vector<int>{1,2,3,4};
for (int i=0; i<globalVector.size();i++) {
cout << "Val = " << globalVector.at(i) << 'n';
}
std::cout << "Hello, world! : " << myNumber << 'n';
return 0;
}

最新更新