如何清空/清除C++数组?有array::fill
,但似乎只适用于C++11?我正在使用VC++ 2010。 如何将其清空(重置为全部0)?
如何清空/清除C++数组?有array::fill
,但似乎只适用于C++11?我正在使用VC++ 2010。 如何将其清空(重置为全部0)?
std::fill_n(array, elementCount, 0);
假设 array
是一个普通数组(例如 int[]
)
std::fill(a, a+N, 0);
std::fill( std::begin( a ), std::end( a ), 0 );
如果没有C++11,你可以按照以下方式自己解决:
template <typename T, std::size_t N> T* end_(T(&arr)[N]) { return arr + N; }
template <typename T, std::size_t N> T* begin_(T(&arr)[N]) { return arr; }
std::fill( begin_( a ), end_( a ), 0 );
std :: fill(std :: begin(a),std :: end(a),0)
。不知何故,这似乎更符合惯用法。(有没有人在使用C++11之前的版本时没有类似的工具包?) - James Kanzestd::fill(a.begin(),a.end(),0);
for (auto& a : SomeArray) a = 0;
对于(自动引用 a :SomeArray)a = 0;
如果你想用除了内置值以外的东西来填充数组,std::fill 就不够用了;相反,我发现 std::generate 很有用。例如,我有一个列表向量需要初始化。
std::generate(v.begin(), v.end(), [] () { return std::list<X>(); });
你也可以使用整数,例如:
std::generate(v.begin(), v.end(), [n = 0] () mutable { return n++; });
或者只是
std::generate(v.begin(), v.end(), [] (){ return 0; });
但我想对于最简单的情况,std::fill更快
如果只是归零,你可以使用memset
:
int* a = new int[6];
memset(a, 0, 6*sizeof(int));
memset
函数,而应该使用适当的C++等效函数。同时,不要手动管理动态数组的内存,应该使用std::vector
代替。请注意保持原文意思不变。 - Konrad Rudolphmemset
呢?只要这是一种数组OP想要的。另一个更严重的问题是第二个参数是计数,意思是6*sizeof(*a)
。 - Michael Krelin - hackerstd::fill
取代。 - Konrad Rudolphmemset
仍然是允许的。而且对于一个老派黑客来说,偶尔看到memset
是一种享受 ;-)话虽如此,我很高兴我们都表达了自己的观点。这样既不会消除memset
也不会滥用它的影响 ;) - Michael Krelin - hackermemset
太容易出错了,因为有更安全的替代方案(通常也更快)。它还有一个额外的缺点,就是它告诉读者作者并不真正了解C++。 - James Kanzechar *begin = myPage.pageArray[0][0];
char *end = begin + sizeof(myPage.pageArray);
std::fill(begin, end, 0);
std::memset
不比 std::fill
更快。 - Konrad Rudolphstd::fill(buf, buf + n, '\0');
可以改写为 memset
。 - user21959052