向量 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的主要内容,如果未能解决你的问题,请参考以下文章