向量 C++ 上的 Memset

Posted

技术标签:

【中文标题】向量 C++ 上的 Memset【英文标题】:Memset on vector C++ 【发布时间】:2009-11-03 03:13:12 【问题描述】:

对于 C++ 中的向量,有没有 memset 的等效函数?

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

【问题讨论】:

【参考方案1】:

使用std::fill():

std::fill(myVector.begin(), myVector.end(), 0);

【讨论】:

如果您担心效率,大多数 STL 实现都会有专门的 std::fill 实现,在可能的情况下执行 memset。 @razeh 目前,gcc 需要-O3 来优化填充,使其与 memset 一样快。 Clang 只需要-O2。 (***.com/a/51274937/5267751)【参考方案2】:

如果您的向量包含POD 类型,则在其上使用 memset 是安全的 - 向量的存储保证是连续的。

memset(&vec[0], 0, sizeof(vec[0]) * vec.size());

编辑:很抱歉给你一个未定义的术语 - POD 代表 Plain Old Data,即 C 中可用的类型以及由它们构建的结构。

再次编辑: 正如 cmets 中所指出的,即使 bool 是一种简单的数据类型,vector<bool> 也是一个有趣的例外,如果您尝试在其上使用 memset,将会惨遭失败. Adam Rosenfield's answer 在这种情况下仍然可以正常工作。

【讨论】:

真的吗?我认为vector 的内存必须是连续的,这是常识。这只是谣言吗? @GMan:是的。在ftp.research.att.com/dist/c++std/WP/CD2/body.pdf 处查看 C++03 草案标准的第 23.2.4 节。它没有提到连续存储。 在我的 ISO03 标准副本中,第 489 页 [23.2.4],它说:“vector 的元素是连续存储的,这意味着如果 v 是 vector<T, Allocator>,其中T 是除bool 之外的某种类型,那么它对所有0 <= n < v.size() 都服从标识&v[n] == &v[0] + n。”我认为这意味着连续,对吧? 我的印象是当前标准可以保证连续存储 - 请参阅***.com/questions/247738/… @Adam Rosenfield:您可能会考虑字符串是否连续。至于向量,“连续性实际上是向量抽象的一部分。它是如此重要,以至于当发现 C++98 标准并不能完全保证连续性时,C++03 标准被修改为明确添加保证”来自herbsutter.wordpress.com/2008/04/07/…【参考方案3】:

你可以在vector中使用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

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

【讨论】:

【参考方案4】:

另一种说法,我想我是在迈耶斯的书中首先看到的:

// Swaps with a temporary.
vec.swap( std::vector<int>(vec.size(), 0) );

它唯一的缺点是它会复制。

【讨论】:

【参考方案5】:

m= 行数 && n== 列数

vector<vector<int>> a(m,vector<int>(n,0));        

【讨论】:

以上是关于向量 C++ 上的 Memset的主要内容,如果未能解决你的问题,请参考以下文章

向量上的 C++ operator() 优化

C++ 向量上的分配错误

使用 memset 初始化包含数组的结构向量

memset向量为0会导致内存泄漏吗?

C++ 使用类对列上的 2d 向量进行排序失败(带比较功能的问题)

在 C++ 中返回一个向量