2013-04-16 2 views
2

매번 변경 될 일부 요소를 저장하려고하지만 어떤 것이 있는지 알 수 없습니다.int 또는 vector 배열?

방법이 더 좋고 그 이유는 무엇입니까? 나는 두 가지 방법을 생각하고있다. 1) int와 loop의 배열을 선언하거나

벡터를 사용한다.

더 좋은 이유는 무엇입니까?

int 배열을 선언해도 누출로 인해 향후 메모리 레 문제가 발생합니까?

아래로 아래의 코드 내가 이야기하고있는 두 가지 방법으로 보여

:

1)

#include <iostream> 
#include <vector> 


int main() 
{ 

    int x[5]; 

    x[0] = 10; 
    x[1] = 20; 
    x[2] = 30; 
    x[3] = 40; 
    x[4] = 50; 


for(unsigned int i = 0;i<=sizeof(x[5]); i++) 
    { 


    std:: cout << "x[" << i << "] = "<< x[i] << std::endl; 

} 

system("pause"); 

    return 0; 
} 

2)

#include <iostream> 
#include <vector> 


int main() 
{ 

    std::vector<int> x; 

    x.push_back(10); 
    x.push_back(20); 
    x.push_back(30); 
    x.push_back(40); 
    x.push_back(50); 


for(unsigned int i = 0;i<=x.size()-1; i++) 
    { 


    std:: cout << "x[" << i << "] = "<< x[i] << std::endl; 

} 

system("pause"); 

    return 0; 
} 
+0

'sizeof (x [5])'. 이 이상한 표현으로 인도하는 것이 궁금합니다. – jrok

+0

@Joe,'x [5]'는 평가되지 않으므로 괜찮습니다. 즉, 여전히 조금 이상합니다. – chris

+0

맞습니다. sizeof (x)를 찾고 있었지만 오타를 피할 수 없었습니다. lol –

답변

8

이 당신이해야 할 모든 경우와 당신의 배열은 항상 컴파일 시간에 알려진 크기를 가질 것이고 std::vector은 필요 없다.

#include <iostream> 
#include <array> 

int main() 
{ 
    std::array<int, 5> x = { 10, 20, 30, 40, 50 }; 
    for (unsigned int i = 0; i < x.size(); i++) 
    //       ^^^^^^^^ 
    { 
     std:: cout << "x[" << i << "] = "<< x[i] << std::endl; 
    } 
} 

: C++ (11) 대신 일반 C 배열의 std::array 사용할 수있는 반면에

( std::array은 C 배열을 통해 제로 오버 헤드, 더 안전하고 더 많은 기능 래퍼입니다) 다음은 live example입니다. std::arraysizeof 연산자 대신 사용할 수있는 size() 멤버 함수를 제공합니다. 여기

std::size_t i = 0; 
for (auto e : x) 
{ 
    std:: cout << "x[" << i++ << "] = "<< e << std::endl; 
} 

live example입니다 : std::array 표준 시퀀스 컨테이너이기 때문에

또한, 당신은 그것의 요소를 통해이 방법을 반복 할 수 있습니다.

+0

더 안전하고 기능적입니다 :) – chris

+0

@chris : 내가 썼습니다 :) Thanks –

+0

그리고 앞으로 어떤 메모리 누수가 발생하지 않을까요? –

3

'더 나은'것도 아닙니다. 둘 다 완전히 다른 사용 사례를 다룹니다.

컴파일 타임에 배열 크기를 알고 100 % 확신 할 수 있다면 변경되지 않을 것입니다. 일반 오래된 배열을 사용하십시오. 오버 헤드가 적고 컴파일러는 경계 외부에서 읽으려는 시도를 발견하여 정적 분석을 도와줍니다.

반면에 배열의 측면이 확실하지 않은 경우 (즉, 파일이나 사용자의 입력을 읽는 경우) std::vector을 사용하십시오. 귀하의 필요를 충족시키기 위해 어떤 규모로든 성장할 수 있습니다.

5

컴파일 타임에 크기를 알고있는 경우 std::array을 사용하십시오. 그렇지 않은 경우 std::vector을 사용하십시오. 두 경우 모두, 요소 보는 반복자를 사용

typedef std::array<int> my_container_type; 
typedef my_container::iterator iterator; 
my_container_type my_container = { whatever }; 

for (iterator it = my_container.begin(); it != my_container.end(); ++it) 
    std::cout << "x[" << (it - my_container.begin()) << "] = " << *it << '\n'; 

반복자를 사용하여 당신은 크게 실수 말도 sizeof(x[5]) 같은 루프 제한, 사용의 위험을 줄일 수 있습니다.