C++ 如何重置C++;带零的内置向量?
如果效率是一个问题,我需要向量,我应该使用什么C++ 如何重置C++;带零的内置向量?,c++,vector,C++,Vector,如果效率是一个问题,我需要向量,我应该使用什么 assert(myVector.size() == wantedSize) memset(&*myVector.begin(),0,myVector.size() * sizeof(T)); myVector.clear(); myVector.resize(wantedSize); myVector.clear(); myVector.assign(wantedSize,0); 我可以假设wantedSize=size()您
assert(myVector.size() == wantedSize)
memset(&*myVector.begin(),0,myVector.size() * sizeof(T));
myVector.clear();
myVector.resize(wantedSize);
myVector.clear();
myVector.assign(wantedSize,0);
我可以假设wantedSize=size()您错过了一个:
std::fill(myVector.begin(), myVector.end(), 0);
而不是执行memset
它是最有效的,因为它不会导致重新分配。不重新分配也意味着不存在迭代器无效,这更安全
std::fill
也是类型安全的,通常推荐用于填充标准容器(不仅仅是std::vector
!)。也更灵活,因为您可以提供除容器的值\u类型
之外的另一种类型的值,只要提供的值可以转换为该值\u类型
就不要为std::vector
@MM使用memset
:当您说“不做某事”时,通常解释原因是有意义的。在std::vector的情况下,memset将起作用。然而,混合使用C/C++例程被认为是不好的,并且已经有std::fill.std::vector保证条目是连续的。“除了BOOLS。”LUK32:“是什么让你想到”这是C++标准的要求。继续读吧。C++03中的23.2.4.1。向量的元素是连续存储的,这意味着如果v是一个向量,其中T是bool以外的某种类型,那么它遵循恒等式&v[n]==&v[0]对于所有的0,+n,它的价值,实际上不是由C++标准保证的,所有的内置类型都是零位,它与分配0一样。对于整数类型,它是有保证的,但不是浮点或指针类型。虽然没有保证,但我确信在当前的所有实现中都是正确的,对于浮动类型Y是正确的。如果您的实现使用IEEE 754表示法,您就可以了。不过,除了担心C函数之外,您还有理由更喜欢fill
而不是memset
,这是保证正确性的。clear()
后跟resize()
或assign()
也保证不会导致重新分配,因为clear()
不会影响容量。当然,它会使迭代器无效。@SteveJessop啊。我明白了。但是一行程序几乎总是比其他解决方案好。-)我承认,实际上是两行。#include
:P