2011-03-10 57 views
6

我已經分配了一個大的雙向量,可以說有100000個元素。在我的代碼中,我想將所有元素設置爲一個常量,非零值。如何在不使用for循環遍歷所有元素的情況下執行此操作? 我也使用blas包,如果有幫助的話。用非零值初始化雙數組(blas)

回答

9

你可以使用std::fill#include <algorithm>):

std::fill(v.begin(), v.end(), 1); 

這實質上也只是順理成章的環..

+0

除了**可能針對某些特定類型和迭代器類別進行優化(即使不太可能)。 – 2011-03-10 13:43:02

+0

我也會推薦這種方法。 – 2011-03-10 13:54:03

0

你總是使用memset()如果你不想循環。

也就是說,memset(myarr, 5, arrsize);爲了填補所有5。小心隱式轉換爲無符號字符。

提要

#include <string.h> 

void * 
memset(void *b, int c, size_t len); 

說明

The memset() function writes len bytes of value c (converted to an 
unsigned char) to the byte string b. 

而如果向量是大,你需要它去快,你正在使用gcc,則:

代碼生成塊移動(memcpy) 和塊集(memset)被重寫。 GCC現在可以選擇最好的算法 (循環,展開的循環,與 代表前綴或庫調用指令)的基礎上 正在複製的塊的尺寸和 所述CPU進行了優化。

+0

-1:他有一個雙向量和一個雙向量的memset(我可以理解它是一個連續的向量下面的數組),當他特別希望它是一個非零值不是微不足道的。可以通過memset設置的值是一個字節(無符號字符的大小),而他想設置的常量是4個字節 – 2011-03-10 13:52:31

+0

在讀取時錯過了雙向量。如果他需要全部4字節填充,那麼是的,這是不行的。另一方面,他可能希望將它們標記爲「未使用」,並且一個字節可以實現。 – Milan 2011-03-10 13:54:31

+0

雖然我沒有看到OP提及。但要準確地說出他的問題,我相信std :: fill是他的最佳選擇。 – 2011-03-10 13:56:51

3

'fill'與您所說的完全吻合。

注意,它也可以構建載體充滿了規定值:

std::vector<double> vec(100000, 3.14); 

所以,如果「在某一時刻」是指「建設後,立即」,做到這一點吧。此外,它意味着你可以這樣做:

std::vector<double>(100000, 3.14).swap(vec); 

如果「在某一時刻」「更改尺寸後立即」的意思,和你期望/希望被重新分配矢量(「期望」,如果這可能是有用的你使它比以前的容量更大,「想要」如果你把它變得更小,並且希望它被修剪以節省內存)。