std::vector 사용 안내
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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
hdu 1717 소수 화 점수 2 (수학)소수 화 점수 2 레이 는 수학 시간 에 선생님 의 말씀 을 듣 고 모든 소수 가 점수 로 표시 되 는 형식 이 라 고 말 했다. 그 는 녹 기 시 작 했 고 곧 완성 되 었 다. 그러나 그 는 또 하나의 문 제 를...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.