矢量C++上的Memset

avd*_*avd 44 c++ vector

memsetC++ 中的向量是否有任何等价函数?

(不是clear()erase()方法,我想保留向量的大小,我只想初始化所有值.)

Ada*_*eld 81

用途std::fill():

std::fill(myVector.begin(), myVector.end(), 0);
Run Code Online (Sandbox Code Playgroud)

  • 如果您担心效率,大多数STL实现将具有专门的std :: fill实现,可以在可能的情况下执行memset. (8认同)

Mar*_*som 25

如果您的向量包含POD类型,则可以安全地使用memset - 向量的存储保证是连续的.

memset(&vec[0], 0, sizeof(vec[0]) * vec.size());
Run Code Online (Sandbox Code Playgroud)

编辑:抱歉向您抛出一个未定义的术语 - POD代表普通旧数据,即C中可用的类型以及从它们构建的结构.

再次编辑:正如评论中指出的那样,即使bool是一种简单的数据类型,vector<bool>也是一个有趣的例外,如果你试图在其上使用memset,它将会失败.在这种情况下,亚当罗森菲尔德的答案仍然完美无缺.

  • 在我的ISO03标准副本中,在第489页[23.2.4],它说:"`vector`的元素是连续存储的,这意味着如果v是`vector <T,Allocator>`其中T是some除了`bool`之外的类型,然后它服从所有`0 <= n <v.size()`的标识`&v [n] ==&v [0] + n`." 我认为这意味着连续,对吗? (6认同)
  • @Adam Rosenfield:你可能会想到字符串是连续的还是不连续的.至于向量,"连续性实际上是向量抽象的一部分.事实上,当发现C++ 98标准不能完全保证连续性时,它是如此重要,C++ 03标准被修改为明确添加保证"来自http://herbsutter.wordpress.com/2008/04/07/cringe-not-vectors-are-guaranteed-to-be-contiguous/ (3认同)

Jay*_*llo 5

您可以在向量中使用assign方法:

为向量分配新内容,替换其当前内容,并相应地修改其大小(如果不更改向量大小,只需传递 vec.size() )。

例如:

vector<int> vec(10, 0);
for(auto item:vec)cout<<item<<" ";
cout<<endl;
// 0 0 0 0 0 0 0 0 0 0 

// memset all the value in vec to 1,  vec.size() so don't change vec size
vec.assign(vec.size(), 1); // set every value -> 1

for(auto item:vec)cout<<item<<" ";
cout<<endl;
// 1 1 1 1 1 1 1 1 1 1
Run Code Online (Sandbox Code Playgroud)

引用: http: //www.cplusplus.com/reference/vector/vector/assign/