C언어 배열의 문제점
- 배열의 크기는 컴파일 시간에 결정되는 상수이어서 프로그램 실행 중에는 변경될 수 없다.
- 따라서 원소를 추가하거나 삭제할 수 없다.
- 대부분의 응용 프로그램에서 데이터는 동적이고 고정크기가 아님, 즉 배열을 크게 잡을 경우 쓸모없이 메모리를 잡아두게 되고, 배열을 작게 선언할 경우 오버플로우가 발생함.
- C언어에서는 동적할당을 위해서는 malloc(), calloc()과 같은 동적할당을 사용하여야 함.
메모리 구조 : http://www.tcpschool.com/c/c_memory_structure
Vector 컨테이너
- 자동으로 메모리가 할당되는 배열
- 배열처럼 연속적인 메모리 공간에 저장하여 index로 접근 가능함. v[0]. v[1]
- 앞쪽이 막혀 있는 형태로 앞쪽에는 원소를 추가, 제거할 수 없고, 뒤쪽에서만 원소를 추가, 제거 가능
vector의 사용
- 헤더파일 추가 #include
- vector의 선언은
std::vector<[data type]> [변수이름]
#include<vector>
vector<int> v;
vector<string> p;
vector<int> v(5);
vector<int> v(5,5);
vector<pair<int, int>> vp;
vector<int> v;
: 자료형이 int형인 벡터 선언
vector<string> p;
: 자료형이 문자열인 벡터 선언
vector<int> v(5)
: 5개의 벡터방을 생성하고, 동시에 각 벡터방의 값을 0으로 초기화
vector<int> v(5,5)
: 미리 5개의 벡터방을 생성하고, 동시에 각 벡터방의 값을 5으로 초기화
vector<pair<int,int> vp
: 두개의 값을 쌍으로 하나의 벡터방에 저장함
vector의 멤버 함수
구분 | 기능 | 예시 |
---|
push_back(x); | 마지막 원소 뒤에 자료 x 삽입 | v.push_back(7); |
insert(k,x); | k위치 앞에 자료 x 삽입 | v.insert(v.begin()+2,4); |
pop_back(); | 마지막 원소를 제거 | v.pop_back(); |
clear(); | 모든 원소를 제거 | v.clear(); |
erase(); | 특정 원소를 제거 | v.erase(v.begin()+2); |
at(i); | I번째 원소를 참조함 | v.at(i); v[i]처럼 사용가능 |
front(); | 첫 번째 원소 참조함 | v.front(); |
back(); | 마지막 원소를 참조함 | v.back(); |
size(); | 원소의 개수를 리턴함 | v.size(); |
empty(); | 벡터가 비어있는지 확인 | v.empty(); |
이터레이터
- 포인터와 비슷하게 동작하며 컨테이너에 저장된 원소를 순회하고 접근할 수 있는 방법 제공
- 반복자로 원소에 접근할 때는 *연산자를 사용하여 접근할 수 있다.
vector<int>::iterator iter = vec.front()
😁 예시
#include<bits/stdc++.h>
using namespace std;
int main(){
vector<int> v;
vector<int>::iterator iter;
for(int i=1;i<10;i++){
v.push_back(i);
}
iter = v.begin();
cout<<*iter<<'\n';
iter++;
cout<<*iter<<'\n';
vector<int>::iterator iter2=v.end();
cout<<*iter2<<'\n';
cout<<*(iter2-1)<<'\n';
}
관련문제