Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何清除C++;阵列? 如何清除/清空C++数组?有,但看起来像它的C++11只?我正在使用VC++2010。如何清空它(重置为全部0)_C++_Visual C++ - Fatal编程技术网

如何清除C++;阵列? 如何清除/清空C++数组?有,但看起来像它的C++11只?我正在使用VC++2010。如何清空它(重置为全部0)

如何清除C++;阵列? 如何清除/清空C++数组?有,但看起来像它的C++11只?我正在使用VC++2010。如何清空它(重置为全部0),c++,visual-c++,C++,Visual C++,假设array是一个普通数组(例如int[])如果仅为0,则可以使用memset: int* a = new int[6]; memset(a, 0, 6*sizeof(int)); 假设一个大小为N的C样式数组a,其中一个类型的元素可以从0隐式转换,下面将所有元素设置为从0构造的值 std::fill(a, a+N, 0); 请注意,这与“清空”或“清除”不同 编辑:根据james Kanze的建议,在C++11中,您可以使用更惯用的替代方法 std::fill( std::begin(

假设
array
是一个普通数组(例如
int[]

如果仅为0,则可以使用
memset

int* a = new int[6];

memset(a, 0, 6*sizeof(int));

假设一个大小为
N
的C样式数组
a
,其中一个类型的元素可以从
0
隐式转换,下面将所有元素设置为从
0
构造的值

std::fill(a, a+N, 0);
请注意,这与“清空”或“清除”不同

编辑:根据james Kanze的建议,在C++11中,您可以使用更惯用的替代方法

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 );
模板T*end_uT(T(&arr)[N]){return arr+N;}
模板T*begin_uT(&arr)[N]){return arr;}
标准:填充(开始(a),结束(a),0);

嘿,我认为处理这种操作的最快方法是对内存进行memset()

范例-

memset(&myPage.pageArray[0][0],0,sizeof(myPage.pageArray))

<强>类似的C++方式是使用STD::Pult

char *begin = myPage.pageArray[0][0];
char *end = begin + sizeof(myPage.pageArray);
std::fill(begin, end, 0);

如果您想用值以外的内容清除数组,std::file不会剪切它;相反,我发现std::generate很有用。e、 我有一个要初始化的列表向量

std::generate(v.begin(), v.end(), [] () { return std::list<X>(); });
或者只是

std::generate(v.begin(), v.end(), [] (){ return 0; });

但我认为std::fill对于(auto&a:SomeArray)a=0的最简单情况更快

请不要使用
memset
。使用适当的C++等价物代替C函数。对于动态阵列,不要使用手动管理的内存。改用std::vector
。为什么不呢
memset
很好,但前提是这是OP所指的一种数组。另一个更严重的问题是第二个参数是count。意思是
6*sizeof(*a)
@Michael,除此之外,它只适用于pod,所以它的范围非常有限。它在C++中没有位置,它完全被<代码> STD::填充< /代码>所取代。即使你不喜欢,也不允许代码< > MyStuts<代码>。对于一个老式的黑客来说,偶尔看到memset是一种乐趣;-)尽管如此,我很高兴我们都表达了自己的观点。这样,empact既不会被设置,也不会被滥用;)@KonradRudolph我同意你的看法:
memset
太容易出错,因为有更安全的替代方案(通常也更快)。它在告诉读者的方面有额外的缺点:作者并不真正了解C++。重置所有到0都不是空的。数组从来都不是空的,是吗?零大小的数组大部分是空的。@MichaelKrelin hacker对,我应该用“数组永远不能被清空”来形容它。@juanchopanza更一般地说:数组的大小永远不能改变。(清空只是更一般规则的一个特例。)当然,由于没有动态分配数组的情况,所以可以说数组永远不能为空。在C++11中,您还可以编写
std::fill(std::begin(a),std::end(a),0)
。不知何故,这似乎更为惯用。(有没有使用C++11之前版本的人在他们的工具箱中没有类似的东西?@MichaelKrelin hacker,我的解释是将它设置为默认值,所以对于int,它是0?好吧,也许这个词用得不对。但我想知道它到底是什么meant@JamesKanze同意,但由于OP暗示C++11是不受限制的,所以我提出了不那么优雅的解决方案。我将添加一些(未经完全测试的)自制解决方案。@JiewMeng您可以在问题中更清楚地说明这一点。注意,您甚至没有提到您的阵列包含
int
<代码> STD::MyStuts<代码>不比 STD::填写< /Calp>。C++标准类型(因为C++ 11)数组有一个成员函数填充(value)将要执行。底层实现可以使用memset。
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; });