2011-03-10 6 views
6

큰 이중 벡터를 할당했으며, 100000 요소로 말할 수 있습니다. 내 코드의 어느 시점에서 모든 요소를 ​​일정한 0이 아닌 값으로 설정하려고합니다. 모든 요소에 대해 for 루프를 사용하지 않고 어떻게이 작업을 수행 할 수 있습니까? 도움이된다면 blas 패키지도 사용하고 있습니다.0이 아닌 값 (blas)을 사용하여 double 배열을 초기화하십시오.

답변

9

당신은 std::fill (#include <algorithm>) 사용할 수 있습니다

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

이 본질적 물론 단지 루프입니다 ..

+0

** 특정 유형 및 반복기 범주에 최적화 될 수 있음을 제외하고 ** (** 가능성이 희박하더라도). –

+0

이 방법을 권하고 싶습니다. –

0

당신이 루프하지 않으려면 항상 memset()를 사용합니다.

즉, memset(myarr, 5, arrsize);입니다. 모두 5로 채우십시오. unsigned char로 암시 적 변환을주의하십시오.

사용법

#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를 으로하여 (루프, 언 롤 루프, rep 접두어 또는 라이브러리 호출을 사용하는 명령) 알고리즘을 선택할 수 있습니다.

+0

-1 : 그는 두 배 벡터와 두 배의 벡터에 대한 memset을 가지고 있습니다. 벡터 밑에 연속 된 배열로 이해할 수 있습니다. 특히 0이 아닌 값을 원할 때는 사소한 것이 아닙니다. memset을 통해 설정할 수있는 값은 바이트 (unsigned char의 크기)이며, 설정하려는 상수는 4 바이트입니다. –

+0

읽는 동안 이중 벡터가 누락되었습니다. 그가 4bytes를 모두 채워야한다면, 그렇습니다. 다른면에서 그는 아마도 "사용되지 않은"것으로 표시하고 1 바이트가 트릭을 수행 할 수 있습니다. – Milan

+0

그래도 그 일을 언급하는 OP가 보이지 않습니다. 그러나 그의 질문에 정확하게 말하면 나는 std :: fill이 최선의 선택이라고 믿는다. –

3

'채우기'는 귀하가 말한 바로는 것입니다.

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

그래서 "어떤 점에서"의미있는 경우 "즉시 건설 후"대신 이렇게 :

는 지정된 값의 전체 벡터를 구성 할 수도 있음을 유의하십시오. 또한,이 작업을 수행 할 수 있음을 의미합니다 :

"어떤 시점에서" "바로 크기를 변경 한 후"의미하고, 당신이 만약 "기대"(/는 벡터가 재 할당 할 것으로 예상되는 경우 유용 할 수 있습니다
std::vector<double>(100000, 3.14).swap(vec); 

이전 용량보다 더 크게 만들고 있습니다. 작게 만들고 메모리를 절약하기 위해 손질하려는 경우 "원하는"것이 좋습니다.

관련 문제