반응형

C++11 : STL std::array 정적배열

배경

 C++11에서 등장한 array는 기존의 정적 배열(이제는 C Style array 라고 불림)을 개선하기 위해서 등장을 했다. C/C++ 외의 다른 프로그래밍 언어를 조금 훝어보면 알 수 있다.


 JAVA, JS, C# 등에서의 배열을 선언/정의 할때 부가 정보(Length 등)가 같이 있는 것에 비해서 C++11이전의 C Style static array은 단순히 연속된 메모리 공간의 앞부분을 가르키는 포인터에 불과 했었다. 이로 포인터를 사용할 경우 잘못된 메모리 참조 또는 이를 개선하기 위한 추가 코딩으로 인한 생산성 저하로 이어지는 문제가 있다.


 그래서 C++11이전에서는 std::vector를 사용하기도 했다. 그러나 C Style Array에 비해서 성능 저하의 부담이 크며, 오버플로워가 일어나면, 동적으로 용량을 늘려 버리는 바람에 정해진 크기를 버퍼로 사용하기에는 잠재적인 문제가 있을 수 있다(물론 좋은 프로그래머는 이런 문제를 예방을 할 것이다).


 std::array는 vector보다 경량이며, 기존의 정적 배열의 성질을 가졌으며, 반복자등 일부 STL 컨테이너를 사용할 수 있게 만들어졌다.



선언 및 초기화 방법

 array표준헤더파일을 포함해야 사용할 수 있다. 타입과 배열크기를 입력하고 기존 컨테이너처럼 선언하고 사용할 수 있다. <>에 첫인자는 자료형(type), 두번째 인자는 크기를 입력해야 한다.

#include <array>

int main(const int argc, const char * argv[])
{
    std::array<int, 5> arr1 = {1, 2, 3};
    std::array<int, 5> arr2(1, 2, 3);
    std::array<int, 5> arr3{1, 2, 3};

    return 0;
}


주요 특징

 정의된 array의 남는 원소에는 0으로 초기화가 된다.

 array도 vector와 같이 객체명(혹은 변수명) 뒤에 대괄호로 배열처럼 사용할 수 있다.

 vector처럼 반복자를 사용할 수 있다.


예시

// arrayEx.cpp
#include <array>
#include <iostream>

int main(cosnt int argc, const char * argv[])
{
    std::array<int, 5> arr1{1, 2, 3};
    // 네번째 int에 접근하여 값을 대입함
    arr1[3] = 4;
    // 반복자처럼 사용 가능
    auto itArr = arr1.begin();
    for(; itArr != arr1.end(); ++itArr)
    {
        std::cout << (*itArr) << std::endl;
    }
    // 출력결과 arr1[4](5번째)는 0으로 초기화 되어 있음
    return 0;
}


 size() 함수로 배열의 크기를 알 수 있다. 단, capacity()가 없다. 이는 vector와 가장 큰 차이 중 하나다. 이는 array경우 size()와 capacity()가 따로 있을 필요가 없기 때문이다.

 array로 선언된 객체명은 array라는 컨테이너의 포인터이기이다. 이 때문에 기존의 정적 배열의 첫번째 포인터가 필요할 경우 vector와 같이 data()를 호출해서 사용해야 한다. 이는 오래된 라이브러리를 호환해야 한다던가 버퍼로 사용하기에 적절하다.

 fill()로 특정 원소값으로 모든 원소를 초기화 할 수 있다.


이 밖의 자세한 특징은 cpprefernce 문서를 참조하면 된다.



참조자료

cppReference 문서




반응형
반응형

JS : 배열 삭제(Array remove)

작성 계기

 일반적인 모듈에서 많이 사용하는 것에 비해서 자주 잊어 먹기때문에 정리를 해두려는 목적으로 작성하였다. 물론 w3s에서 제공하는 영문 문서에 가장 자세하게 기록이 되어 있다.


배열 삭제 메서드

JS는 어떠한 객체든지 기본적인 메서드를 갖고 있다. 그 중 배열타입(자료형: type)에서 제공 되는 삭제는 많이 갖고 있다. 이러한 메서드들은 객체에 귀속되어 있기 때문에 사용할 때에는 객체 뒤에 닷(dot: ".")을 찍어 줘야 한다.


pop()

 스택 자료형에서 들어 본적이 있다면, 익숙한 단어이다. 당연 배열의 가장 뒤에서 부터 삭제를 하는 메서드이다. 이때 삭제되는 원소가 반환된다.

var arr = [1, 2, 3, 4];
var one = arr.pop();   // one === 4


shift()

 큐 자료형에서 들어본적 있을 법한 단어이다. pop()과는 순서상 반대로 배열의 앞에 있는 원소를 반환하면서 삭제한다.

var arr = [1, 2, 3, 4];
var one = arr.pop();    // one === 1


delete

 엄밀하게는 메서드라 할 수 없다. 때문에 사용법도 다르다. 게다가 이 방법으로 삭제된 배열의 원소는 공백(undefined)이 생긴다. 가능하면 쓰지 말자. pop()과 shift()와의 차이점은 배열의 원하는 위를 바로 삭제할 수 있다.

var arr = [1, 2, 3, 4];
delete arr[2];    // arr === [1, 2, undefined, 4]


splice(index, number)

 앞의 pop()과 shift()는 맨앞이나 맨뒤의 요소만 삭제가 가능하다. 하지만 이 메서드는 배열의 중간에 삭제할 수 있다. index배열의 index 번호이고, 뒤의 number는 삭제할 개수이다. 해당 메서드는 삭제외에 삽입의 기능으로 사용도 가능하다. number이후에 추가되는 객체들은 배열에 삽입이 된다. 배열에서 원하는 위치에서 배열의 원소를 삭제하고 싶을 경우 사용이 가능하기 때문에 보통 일반적인 클래스를 만들때 사용하면 매우 유용하다.

var arr = [1, 2, 3, 4];
arr.splice(1, 2);    // arr === [1, 4]


참고자료

w3s : http://www.w3schools.com/js/js_array_methods.asp

반응형

+ Recent posts