Showing posts with label container. Show all posts
Showing posts with label container. Show all posts
2009/09/27
map 에서의 원소 추가 및 접근 ( insert, find, operator[] )
stl 의 컨테이너 중 하나인 map 에는 원소의 추가와 접근 할 때 operator 에 의한 방법과 함수에 의한 방법이 있다.
이 두 가지 방법에는 차이가 있다.
존재하지 않는 키에 대한 접근이 일어날 경우 operator[]는 빈 객체를 만들어 생성여 반환을 하고 find 함수는 맵의 마지막 포인터를 반환한다.
operator[] 에 의한 키의 접근시 존재가 확실하지 않는 경우라면 예기치 않은 원소를 만들 수 있다.
Original Post : http://neodreamer-dev.tistory.com/328
이 두 가지 방법에는 차이가 있다.
존재하지 않는 키에 대한 접근이 일어날 경우 operator[]는 빈 객체를 만들어 생성여 반환을 하고 find 함수는 맵의 마지막 포인터를 반환한다.
operator[] 에 의한 키의 접근시 존재가 확실하지 않는 경우라면 예기치 않은 원소를 만들 수 있다.
std::map< int, std::string > alias;
// alias [0]()
// operator[]에 의한 데이터 추가
alias[ 1 ] = "cat";
// alias [1]((1,"cat"))
alias[ 2 ] = "dog";
// alias [2]((1,"cat"),(2,"dog"))
// insert 함수에 의한 추가
alias.insert( make_pair( 3, "bird" ) );
// alias [3]((1,"cat"),(2,"dog"),(3,"bird"))
alias.insert( make_pair( 4, "flog" ) );
// alias [4]((1,"cat"),(2,"dog"),(3,"bird"),(4,"flog"))
// operator[]에 의한 데이터 접근
std::string animal;
animal = alias[ 3 ];
// animal "bird"
animal = alias[ 5 ];
// alias [5]((1,"cat"),(2,"dog"),(3,"bird"),(4,"flog"),(5,""))
// animal ""
// find 함수에 의한 접근
std::map< int, std::string >::iterator itFind = alias.find( 2 );
// itFind (2,"dog")
if ( itFind != alias.end() )
{
animal = itFind->second;
// animal "dog"
}
itFind = alias.find( 6 );
// itFind (-842150451,<Bad Ptr>)
// alias [5]((1,"cat"),(2,"dog"),(3,"bird"),(4,"flog"),(5,""))
if ( itFind != alias.end() )
{
animal = itFind->second;
}
Original Post : http://neodreamer-dev.tistory.com/328
2009/02/23
[STL] map 의 맨 마지막 원소에 접근하기 (map.end() 는 마지막 원소가 아니다!!)
vector 나 list의 경우 크기를 가져와 마지막 원소에 쉽게 접근 할 수 있지만 map의 경우 Key 에 의해 접근으로 find() 멤버함수를 이용하여 iterator를 가져와서 접근할 수 있다.
그러면 맨 마지막 값을 가져오기 위해서는 맨 마지막 iterator를 가져오기만 하면 되는데...
map 의 member 함수 중 end() 함수가 있는데 이는 맨 마지막 iterator를 가리키기 않는다. end() 함수는 맨마지막 원소를 넘어선 map의 가장 마지막을 가르킨다. 그래서 end() 함수를 활용하여 맨 마지막 원소에 접근하려면 증감연산자(--)를 이용해 한단계 앞으로 iterator를 옮겨 주면 된다. 그리고 map 에는 rbegin() 이라는 함수도 제공하는데 이는 현재 map에 있는 원소를 거꾸로 하였을때 맨 처음 원소를 가리킨다.
위의 코드중 end() 함수에 의한 접근은 위험 요소를 갖고 있다. map에 저장된 데이터가 하나도 없을 경우 에러를 발생한다. end()에 의한 접근 전에 map의 크기를 검사 하는 루틴을 포함해 주어야한다.
Original Post : http://neodreamer-dev.tistory.com/257
그러면 맨 마지막 값을 가져오기 위해서는 맨 마지막 iterator를 가져오기만 하면 되는데...
map 의 member 함수 중 end() 함수가 있는데 이는 맨 마지막 iterator를 가리키기 않는다. end() 함수는 맨마지막 원소를 넘어선 map의 가장 마지막을 가르킨다. 그래서 end() 함수를 활용하여 맨 마지막 원소에 접근하려면 증감연산자(--)를 이용해 한단계 앞으로 iterator를 옮겨 주면 된다. 그리고 map 에는 rbegin() 이라는 함수도 제공하는데 이는 현재 map에 있는 원소를 거꾸로 하였을때 맨 처음 원소를 가리킨다.
map< int, Data* > mpData;
// end() 의한 마지만 원소 접근
map< int, Data* >::iterator it = --mpData.end();
Data* pData = it->second;
// rbegin() 에 의한 마지막 원소 접근
map< int, Data* >::reverse_iterator it = mpData.rbegin();
Data* pData = it->second;
위의 코드중 end() 함수에 의한 접근은 위험 요소를 갖고 있다. map에 저장된 데이터가 하나도 없을 경우 에러를 발생한다. end()에 의한 접근 전에 map의 크기를 검사 하는 루틴을 포함해 주어야한다.
Original Post : http://neodreamer-dev.tistory.com/257
2008/01/08
vector를 이용한 2차원 동적 배열
STL의 컨테이너인 vector를 이용하여 2차원 동적 배열을 구현해 보았다.
vector를 이용하기 위한 포함 파일을 포함하는 방법은 개발툴 마다 조금씩 다르다.
Visual Studio 의 경우
C++ Builder 경우
vector를 활용한 2차원 동적 배열은 vector 를 담는 vector 이다.
선언은 아래와 같다.
선언시 주의해야할 사항은 마지막 angle bracket 2개를 붙여쓰면 쉬프트 연산자로 인식해 에러를 발생한다.
배열을 초기화 하기 위해서 원하는 ROW 만큼 반복을 하며 원하는 COL 크기의 vector를 만들어 동적 배열 vector에 넣어주면 된다. 설명보다는 코드를 보는 것이 이해가 빠를 것이다.
vector 를 활용한 배열이기 때문에 위와는 다르게 각 ROW 마다 원소수(COL 의 크기)를 다르게 설정할 수도 있다. 그때 배열에 접근 할때는 인자가 범위를 벗어나지 않도록 주위를 해야한다.
이렇게 할당한 배열을 삭제할 때는 각각의 ROW 에 포함된 COL 데이터를 삭제하고 마지막으로 ROW 데이터를 삭제하면 된다.
접근 방법은 일반 배열을 접근하듯이 하면 된다.
vector를 이용하기 위한 포함 파일을 포함하는 방법은 개발툴 마다 조금씩 다르다.
Visual Studio 의 경우
#include <vector>
using namespace std;
C++ Builder 경우
#include <vector.h>
vector를 활용한 2차원 동적 배열은 vector 를 담는 vector 이다.
선언은 아래와 같다.
vector < vector < int > > vcArray;
선언시 주의해야할 사항은 마지막 angle bracket 2개를 붙여쓰면 쉬프트 연산자로 인식해 에러를 발생한다.
배열을 초기화 하기 위해서 원하는 ROW 만큼 반복을 하며 원하는 COL 크기의 vector를 만들어 동적 배열 vector에 넣어주면 된다. 설명보다는 코드를 보는 것이 이해가 빠를 것이다.
for ( int i = 0 ; i < ROW; ++i ) // 주어진 ROW 만큼 반복
{
vector<int> elem; // vector 를 생성하고
elem.resize(COL); // 원하는 COL 크기로 할당
vcArray.push_back(elem); // 배열에 추가
}
vector 를 활용한 배열이기 때문에 위와는 다르게 각 ROW 마다 원소수(COL 의 크기)를 다르게 설정할 수도 있다. 그때 배열에 접근 할때는 인자가 범위를 벗어나지 않도록 주위를 해야한다.
이렇게 할당한 배열을 삭제할 때는 각각의 ROW 에 포함된 COL 데이터를 삭제하고 마지막으로 ROW 데이터를 삭제하면 된다.
for (int row = 0; row < (int)vcArray.size(); ++row)
vcArray[row].clear();
vcArray.clear();
접근 방법은 일반 배열을 접근하듯이 하면 된다.
int temp = vcArray[1][2];
vcArray[1][2] = 3;
Original Post : http://neodreamer-dev.tistory.com/19
Labels:
2차원동적배열
,
2차원배열
,
array
,
C++ Builder
,
container
,
STL
,
TistoryOldPost
,
Vector
,
Visual C++
,
동적배열
Subscribe to:
Posts
(
Atom
)