2012-01-05 132 views
3

讓我們的我有初始化向量

struct Vector { 

    float i,j,k; 
} 

我想零VEC以下聲明的所有元素(I,J,K = 0)

std::vector <Vector> vec; 
vec.resize(num,0); 

我不希望使用reserve()然後push_back()一個接一個地置零。另一件事是,在成功初始化vec之後,我想在vec被操縱後將vec的所有成員重新設置爲零。有什麼像memset向量?

編輯: 我比較所有的麥克西摩和XEO的答案和結果 size_t size = vec.size(); vec.clear(); vec.resize(size);的方法是最快的,如果他們在一個循環中經常重複。

回答

7

這是非常簡單的:

vec.resize(num); 

或與所需大小初始化它:

std::vector<Vector> vec(num); 

兩個構造函數和resize將填充值初始化的對象的新元素。沒有默認構造函數的類型的值初始化對象(如Vector)將將所有數字成員初始化爲零。

要一切歸零,要麼

size_t size = vec.size(); 
vec.clear(); 
vec.resize(size); 

或:

std::fill(vec.begin(), vec.end(), Vector()); 

,或者效率較低,但具有較強的異常保證:

std::vector<Vector>(vec.size()).swap(vec); 
+0

關於重新設置,哪個更快,vec.clear ...或填充...? – Shibli 2012-01-05 15:29:10

+0

@Shibli:他們幾乎可以肯定速度非常相似。如果對你很重要,那麼你必須測量它們。如果速度真的很重要,你可能會發現'memset'稍微快一些(見Xeo的答案),但是如果你修改你的類型以使它不再是POD,它將會以不確定的方式破壞,因此更加危險。再說一次,判斷它是否更快的唯一方法就是測量它。 – 2012-01-05 15:35:04

1

C++目前所有的元素設置爲0方式:

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

,或者,重新初始化給定的尺寸:

vec.clear(); 
vec.resize(num, 0); 

這可能不是爲memset爲高性能,但99%的案例足夠好。

+0

我應該在VEC包括0 .resize(num,0)?因爲邁克西摩沒有那樣做。 – Shibli 2012-01-05 15:26:27

+0

他解釋了他的答案中的隱式初始化。使用默認的構造函數(沒有0)是好的。 – thiton 2012-01-05 15:29:01

1

可以只使用memset,只要你Vector是一個POD類型:

std::vector<Vector> v(num, 0); // inital fill 
// do stuff 
memset(&v[0], 0, sizeof(Vector) * v.size()); 

雖然C++版本將與std::fill

#include <algorithm> 

std::fill(v.begin(), v.end(), 0); 
+0

@Mike:哦,好點。謝謝你提醒我。 – Xeo 2012-01-05 15:14:11

+0

如果是C++版本或方式會發生什麼?如果它以其他方式會發生什麼? – Shibli 2012-01-05 15:30:07

+0

@Shibli:'std :: fill'適用於任何可以放入'vector'的類型。'memset'僅對普通數據(POD)類型有效;如果類型具有構造函數,析構函數,虛函數或其他複雜性,它將會中斷。 – 2012-01-05 15:38:07