vector - 동적인 배열이며 원소들의 순서가 있으며 랜덤 액세스를 지원한다.
- 끝에 원소를 추가하거나 제거한다면 놀라운 성능이나 중간에 데이타 삽입이면 느려진다.
a) vector의 성능을 더 끌어올리는 방법은 원소를 저장하기전에 필요한 메모리보다 더 큰 메모리를 확보해 놓는것이다.
재할당은 피하기 위해서는 reserve()를 사용하면 된다.
ex) std::vector<int> v;
v.reserve(80); //80개의 원소를 위해 메모리를 확보한다.
아니면 std::vector<T> v(5); //vector를 생성하고 5개의 값으로 초기화한다.
b) vector는 용량이 절대로 줄어들 수 없다. 줄일수 있는 간접적인 방법으로 다른 vector와 원소들은 보호하면서
교체할 수 있다.
c) 기존의 값을 없애면서 새로운 값을 할당하는 방법 - assign
std::list<elem> l;
std::vector<elem> coll;
coll.assign(l.begin(),l.end());
d) 원소 액세스 방법
c.at(idx) - 인덱스가 idx의 원소를 반환 - 인덱스범위가 벗어나게 되면 out_of_range예외를 발생
c[idx]
c.front() - 첫번째 원소반환
c.back() - 마지막 원소반환
e) 반복자 함수들
c.begin() ,c.end(), c.rbegin(), c.rend()
f) 원소의 삽입은 여러 번 호출하여 삽입하는것보다 여러 원소들을 한번의 호출로 삽입하는 것이 유리하다.
c.insert(pos,elem) - pos에 elem 삽입
c.insert(pos,n,elem) - n개의 복사본은 pos에 삽입
c.insert(pos,beg,end) - 범위의 원소들을 pos에 삽입
c.erase(pos) - 반복자 pos 위치의 원소를 제거한다.
c.erase(beg,end) - 범위의 모든 원소들을 제거한다.
c.resize(num) - 원소의 갯수를 num개로 변경한다.
c.resize(num,elem) - 원소의 갯수를 num개로 변경한다.
c.clear() - 모든 원소들을 제거한다.
ex) coll.erase(remove(coll.begin(),coll.end(),val),coll.end());
//val을 값으로 가지는 모든 원소 제거
vector<string> sentence;
sentence.reserve(5);
sentence.push_back("hello,");
sentence.push_back("how");
sentence.push_back("are");
sentence.push_back("you");
sentence.push_back("?");
//공백으로 구분하여 원소를 출력한다.
copy(sentence.begin(),sentence.end(),ostream_iterator<string>(cout," "));
cout << endl;
//세부 정보를 보여준다.
cout << "max_size():"<<sentence.max_size() << endl;
g) vector <bool> 클래스
c.flip() - 모든 boolean 원소들을 반전한다.
m[idx].flip() - 인덱스가 idx인 원소들을 반전시킨다.
m[idx] = val - val을 인덱스가 idx인 boolean 원소에 할당한다.
m[idx1] = m[idx2] - 인덱스가 idx2인 원소의 값을 인덱스가 idx인 boolean 원소에 할당한다.
- 끝에 원소를 추가하거나 제거한다면 놀라운 성능이나 중간에 데이타 삽입이면 느려진다.
a) vector의 성능을 더 끌어올리는 방법은 원소를 저장하기전에 필요한 메모리보다 더 큰 메모리를 확보해 놓는것이다.
재할당은 피하기 위해서는 reserve()를 사용하면 된다.
ex) std::vector<int> v;
v.reserve(80); //80개의 원소를 위해 메모리를 확보한다.
아니면 std::vector<T> v(5); //vector를 생성하고 5개의 값으로 초기화한다.
b) vector는 용량이 절대로 줄어들 수 없다. 줄일수 있는 간접적인 방법으로 다른 vector와 원소들은 보호하면서
교체할 수 있다.
c) 기존의 값을 없애면서 새로운 값을 할당하는 방법 - assign
std::list<elem> l;
std::vector<elem> coll;
coll.assign(l.begin(),l.end());
d) 원소 액세스 방법
c.at(idx) - 인덱스가 idx의 원소를 반환 - 인덱스범위가 벗어나게 되면 out_of_range예외를 발생
c[idx]
c.front() - 첫번째 원소반환
c.back() - 마지막 원소반환
e) 반복자 함수들
c.begin() ,c.end(), c.rbegin(), c.rend()
f) 원소의 삽입은 여러 번 호출하여 삽입하는것보다 여러 원소들을 한번의 호출로 삽입하는 것이 유리하다.
c.insert(pos,elem) - pos에 elem 삽입
c.insert(pos,n,elem) - n개의 복사본은 pos에 삽입
c.insert(pos,beg,end) - 범위의 원소들을 pos에 삽입
c.erase(pos) - 반복자 pos 위치의 원소를 제거한다.
c.erase(beg,end) - 범위의 모든 원소들을 제거한다.
c.resize(num) - 원소의 갯수를 num개로 변경한다.
c.resize(num,elem) - 원소의 갯수를 num개로 변경한다.
c.clear() - 모든 원소들을 제거한다.
ex) coll.erase(remove(coll.begin(),coll.end(),val),coll.end());
//val을 값으로 가지는 모든 원소 제거
vector<string> sentence;
sentence.reserve(5);
sentence.push_back("hello,");
sentence.push_back("how");
sentence.push_back("are");
sentence.push_back("you");
sentence.push_back("?");
//공백으로 구분하여 원소를 출력한다.
copy(sentence.begin(),sentence.end(),ostream_iterator<string>(cout," "));
cout << endl;
//세부 정보를 보여준다.
cout << "max_size():"<<sentence.max_size() << endl;
cout << "size():" << sentence.size() << endl;
cout << "capacity():" << sentence.capacity() << endl;
//두번째 값과 네번째값을 교체한다.
swap(sentence[1],sentence[3]);
//"?"원소 앞에 "always"를 할당한다.
sentence.insert(find(sentence.begin(),sentence.end(),"?"),"always");
//마지막 원소에 "!"를 할당한다.
sentence.back() = "!"
cout << "capacity():" << sentence.capacity() << endl;
//두번째 값과 네번째값을 교체한다.
swap(sentence[1],sentence[3]);
//"?"원소 앞에 "always"를 할당한다.
sentence.insert(find(sentence.begin(),sentence.end(),"?"),"always");
//마지막 원소에 "!"를 할당한다.
sentence.back() = "!"
g) vector <bool> 클래스
c.flip() - 모든 boolean 원소들을 반전한다.
m[idx].flip() - 인덱스가 idx인 원소들을 반전시킨다.
m[idx] = val - val을 인덱스가 idx인 boolean 원소에 할당한다.
m[idx1] = m[idx2] - 인덱스가 idx2인 원소의 값을 인덱스가 idx인 boolean 원소에 할당한다.