std::vector 사용 안내

vector 를 사용 하려 면 헤더 파일 을 추가 해 야 합 니 다\#include,
       sort 나 find 를 사용 하려 면 헤더 파일 을 추가 해 야 합 니 다\#include.
       작성 을 간소화 하기 위해 서 는.h 에 using namespace std 를 추가 해 야 합 니 다.
1.vector 의 초기 화 및 할당
  std::vector nVec;//빈 개체
  std::vector nVec(5,-1);//5 개의 요 소 를 포함 하고 값 이-1 인 vector 를 만 들 었 습 니 다.
  std::vector<:string> strVec{"a", "b", "c"};//목록 초기 화   
"()"와"{}"같은 초기 화 상황 에 주의해 야 합 니 다.예 를 들 어:
  std::vector nVec(10,1);//10 개의 요 소 를 포함 하고 값 은 1 입 니 다. 
  std::vector nVec{10,1};//2 개의 요 소 를 포함 하고 값 은 각각 10,1 입 니 다.
 그러나 일반적으로 프로그램 에 서 는 vector 의 요소 개 수 를 알 지 못 하기 때문에 상기 방식 을 사용 하 는 것 이 번 거 롭 기 때문에 push 를 사용 할 수 있 습 니 다.back,하나의 값 을 vector 대상 의 꼬리 요소 로'(push)'vector 대상 의'끝(back)'을 누 르 는 것 을 책임 집 니 다.예 를 들 면:
  std::vector nVec;
  for(int i = 0; i < 5; ++i)
    nVec.push_back(i);//압 입 원소
  for(size_t i = 0; i < nVec.size(); ++i)
    std::cout << nVec[i] << std::endl;//출력 요소
 그 중에서 size()는 vector 요 소 를 가 져 오 는 개수 입 니 다.또한 vector 에 empty()를 사용 하여 vector 에 요소 가 존재 하 는 지 여 부 를 되 돌려 줍 니 다.비어 있 으 면 true 로 돌아 갑 니 다.그렇지 않 으 면 false 로 돌아 갑 니 다.또한 nVec[i]는 아래 표 연산 자 를 통 해 대응 하 는 vector 수 치 를 얻 을 수 있 습 니 다.빈 vector 에 대해 서 는 아래 표 연산 자 를 통 해 요 소 를 추가 할 수 없습니다.예 를 들 어:
  std::vector nVec;
  for(int i = 0; i < 5; ++i)
    nVec[i] = i;    // error
이렇게 코드 를 작성 하 는 것 은 잘못된 것 입 니 다.nVec 는 비어 있 으 며 대상 을 포함 하지 않 습 니 다.물론 아래 표 시 를 통 해 어떤 요소 도 추가 하거나 접근 할 수 없습니다.추가 하려 면 push 를 사용 하 세 요back。
물론 출력 에 대해 서 는 교체 기 iterator 를 사용 하여 표시 할 수 있 습 니 다.예 를 들 어 위의 예 는 다음 과 같 습 니 다.
  std::vector::iterator itr = nVec.begin();
  for(; itr != nVec.end(); ++itr)
    std::cout << (*itr)  << std::endl;
iterator 에 대한 두 가지 표준 라 이브 러 리 유형:iterator 와 constiterator。
이들 의 차 이 는 주로 후자 가 상수 지침 과 유사 해서 읽 기만 하고 수정 할 수 없다 는 것 이다.벡터 대상 이 상수 가 아니라면 둘 다 사용 할 수 있 습 니 다.
2.vector 에 요소 삽입
vector,deque,list,string 은 insert 구성원 을 지원 합 니 다.insert 를 사용 하면 용기 의 임의의 위치 에 0 개 이상 의 요 소 를 삽입 할 수 있 습 니 다.
      일반 insert 함 수 는 교체 기 가 지정 한 위치 에 요 소 를 삽입 하기 전에 예 를 들 어:
  slist.insert(iter,"hello");//iter 이전 위치 에 Hello 추가
벡터,deque,string 의 모든 위치 에 요 소 를 삽입 하 는 것 은 합 법 적 이지 만 이렇게 하면 시간 이 많이 걸 릴 수 있 습 니 다.
  c.insert(pos,num);    // pos 위치 에 요소 num 삽입
  c.insert(pos,n,num);   // pos 위치 에 n 개의 요소 num 삽입
  c.insert(pos,beg,end);  // pos 위치 에 구간 이[beg,end)인 요 소 를 삽입 합 니 다.
     3.vector 요소 삭제
비 array 용기 에 대해 여러 가지 삭제 방식 이 있 습 니 다.erase 를 예 로 들 면:
  c.erase(p);//교체 기 p 에서 지정 한 요 소 를 삭제 하고 삭 제 된 요 소 를 가리 키 는 교체 기 를 되 돌려 줍 니 다.
  c.erase(begin,end);   // b,e 가 지정 한 범위 내의 요 소 를 삭제 하고 삭 제 된 요 소 를 가리 키 는 교체 기 를 되 돌려 줍 니 다.
  c.clear();//모든 요소 삭제
요 소 를 삭제 하면 교체 기 가 잘못 될 수 있 습 니 다.그러므로 아래 의 작성 방식 은 잘못된 것 입 니 다.예 를 들 어:
  std::vector nVec;  for(int i = 0; i < 5; ++i)    nVec.push_back(i);
  std::vector::iterator iter = nVec.begin();  for(; iter != nVec.end(); ++iter)  {
    if(*iter == 1)      nVec.erase(iter);  }
올 바른 방법 은(특정 요 소 를 삭제):
  std::vector::iterator iter = nVec.begin();  for(; iter != nVec.end();)  {    if(*iter == 0)      iter = nVec.erase(iter);    else      iter++;  }
용기 안의 특정한 요 소 를 삭제 합 니 다.작성 방식 은 다음 과 같 습 니 다.
  std::vector::iterator iter = std::find(nVec.begin(),nVec.end(),5);
  if(iter != nVec.end())    nVec.erase(iter);
용기 안의 특정한 범위 내의 요 소 를 삭제 합 니 다.작성 방식 은 다음 과 같 습 니 다.
  first = std::find(nVec.begin(),nVec.end(), value1);  last = std::find(nVec.begin(),nVec.end(), value2);  if(first != nVec.end() && last != nVec.end())/판단 유효성{nVec.erase(first,last);  }
용기 안의 모든 요 소 를 삭제 합 니 다.당연히 이렇게 할 수 있 습 니 다.
  nVec.erase(nVec.begin(),nVec.end());
nVec.clear()도 가능 합 니 다.
4.vector 의 용량 과 크기
vector 는 모든 요소 의 삽입 에 따라 자신 을 증가 시 키 는 것 이 아니 라 항상 추가 메모리 용량 을 분배 합 니 다.이러한 전략 은 vector 의 효율 을 더욱 높 입 니 다.현재 vector 의 크기 를 가 져 오 려 면 size()함 수 를 호출 하고 현재 vector 의 용량 을 가 져 오 려 면 capcity()를 호출 할 수 있 습 니 다.
list 는 용량 이 필요 하지 않 습 니 다.매번 증가 할 때마다 새로운 요 소 를 간단하게 연결 하기 때 문 입 니 다.
     5.사용자 정의 클래스 의 정렬    
    vector 에 저 장 된 내용 이 class 라면 재 작성 을 통 해 
    a.용기 에 대상 이 있 을 때 연산 자 를 사용 합 니 다.
    b.용기 에 대상 포인터 가 있 을 때()또는 비교 함수 로 정렬 하고 비교 함수 의 매개 변 수 는 포인터 입 니 다.  
    c.정렬 사용 std:sort
     
class TestIndex{
public:
	int index;
	TestIndex(){
	}
	TestIndex(int _index):index(_index){
	}
	bool operator()(const TestIndex* t1,const TestIndex* t2){
		printf("Operator():%d,%d/n",t1->index,t2->index);
		return t1->index < t2->index;
	}
	bool operator < (const TestIndex& ti) const {
		printf("Operator<: return="" index="" ti.index="" bool="" compare_index="" testindex="" t1="" t2="" printf="">index,t2->index);
	return t1->index < t2->index;
}
int main(int argc, char** argv) {
	list tiList1;
	list tiList2;
	vector tiVec1;
	vector tiVec2;
	TestIndex* t1 = new TestIndex(2);
	TestIndex* t2 = new TestIndex(1);
	TestIndex* t3 = new TestIndex(3);
	tiList1.push_back(t1);
	tiList1.push_back(t2);
	tiList1.push_back(t3);
	tiList2.push_back(*t1);
	tiList2.push_back(*t2);
	tiList2.push_back(*t3);
	tiVec1.push_back(t1);
	tiVec1.push_back(t2);
	tiVec1.push_back(t3);
	tiVec2.push_back(*t1);
	tiVec2.push_back(*t2);
	tiVec2.push_back(*t3);
	printf("tiList1.sort()/n");
	tiList1.sort();//      
	printf("tiList2.sort()/n");
	tiList2.sort();// 

참고 문서:
1. https://www.cnblogs.com/SkyflyBird/p/4378948.html
2.https://www.cnblogs.com/xzh1993/p/5845985.html

좋은 웹페이지 즐겨찾기