Search Results for 'C++/STL-vector'

2 POSTS

  1. 2012.08.13 vector-소스 한개
  2. 2012.08.13 vector

vector-소스 한개

Posted 2012. 8. 13. 22:20

#include <vector>

#include <iostream>

 #include <cstring>

using namespace std;

 

void MainMenu();

int SearchData();

 

typedef struct PersonInfo{
 char Name[20];
 int Age;
 char ID[20];
 char PW[20];
}Person;

 

void main()

{

 vector<Person> Data;

// iter를 선언해도 되지만 배열은 바로 접근ㅇ ㅣ가능하기에 그냥 사용 

 while(1)

{

MainMenu();
cin >> Select;

if(Select == 1)

{

Person temp;
cout << "이  름 : ";
cin >> temp.Name;
cout << "나  이 : ";
cin >> temp.Age;
cout << "I    D : ";
cin >> temp.ID;
cout << "P    W : ";
cin >> temp.PW;
Data.push_back(temp);

}
  else if(Select == 2){
   for(int i = 0 ; i < Data.size() ; i++){
    cout << "이 름 : " << Data[i].Name << endl;
    cout << "나 이 : " << Data[i].Age << endl;
    cout << "I   D : " << Data[i].ID << endl;
    cout << "P   W : " << Data[i].PW << endl;
   }
  }
  else if(Select == 3){
   if(SearchData() == 1){
    char name[20];
    cout << "이름 입력 : ";
    cin >> name;
    for(int i = 0 ; i < Data.size() ; i++){
     if(!strcmp(name, Data[i].Name))
      Data.erase(Data.begin() + i);
    }
   }
   else{
    char id[20];
    cout << "I  D 입력 : ";
    cin >> id;
    for(int i = 0 ; i < Data.size() ; i++){
     if(!strcmp(id, Data[i].ID))
      Data.erase(Data.begin() + i);
    }
   }
  }
  else if(Select == 4){
   if(!Data.empty())
    Data.clear(); // Data.erase(Data.begin(), Data.end());
   else
    cout << "데이터가 없습니다" << endl;
  }
  else if(Select == 5) break;
 }

 

}

 

void MainMenu()

{

 cout << "--------------" <<endl;
 cout << "     vector     " << endl;
 cout << "--------------" <<endl;
 cout << "1.입      력" << endl;
 cout << "2.출      력" << endl;
 cout << "3.검색 삭제" << endl;
 cout << "4.전체 삭제" << endl;
 cout << "5.종     료" << endl;
 cout << "--------------" <<endl;
 cout << "선     택 : ";

}

 

 int SearchData()

{

 int i;
 cout << "검색할 목록 선택" << endl;
 cout << "1.이 름  2.I  D" << endl;
 cout << "선택 : ";
 cin >> i;

 return i;

}

'C++ > STL-vector' 카테고리의 다른 글

vector  (0) 2012.08.13

vector

Posted 2012. 8. 13. 22:20

벡터(std::vector)

  1. 동적 배열 구조를 c++로 구현한 것.
  2. c의 배열(빠른 랜덤 접근이 가능)처럼 되지만 자동으로 배열의 크기조절과 객체의 추가와 삭제가 가능하다.
  3. 한번에 한 타입만 저장이 가능. 요소에 접근하거나 앞 뒤 또는 요소를 추가하거나 삭제할 수 있다.

     

단 점

1.무조건 선형적으로 만들기때문에 저장공간보다 많은 양의 데이터를 추가시킬 경우에는 현재 보유하고 있는 메모리의 두 배 만큼을 할당하기 때문에 단순한 추가 할당으로는 선형적인 공간을 만들어내지 못하는 경우가 있다. 이럴때 선형적인 다른 공간에 모든 원소를 하나하나 복사하기 때문에 속도가 느려진다.

지금은 기존 표준에서 벡터의 길이가 늘어날 경우 부하가 큰 복사가 아닌, 메모리 상에서의 이동이 이뤄져 성능에 비약적인 발전이 이뤄졌다.

2. 중간 삽입 삭제가 불가능

 

벡터는 삽입삭제는 느리지만 검색은 빠르다.... ☆

 

가능한점

  1. 크기변경
  2. 순차 접근
  3. 랜덤 접근

 

원본> http://blog.naver.com/bravedog/100005052459

■ vector의 생성자와 소멸자

동작

효과

vector<Elem> c

원소 원이 빈 vector를 생성한다

vector<Elem> c1(c2)

같은 타입의 다른 vector를 복사하여 생성한다(모든 원소들은 복사된다)

vector<Elem> c(n)

디폴트 생성자에 의해서 생성되는 n개의 원소와 함깨 vector를 생성한다

vector<Elem> c(n,elem)

elem 원소의 n개의 복사본으로 vector를 초기화하여 생성한다

vector<Elem> c(begn,elem)

[beg,end) 범위의 원소로 vector를 초기화하여 생성한다

c.~vector<Elem>()

모든 원소들을 파괴하고 메모리를 해제한다


 

■ vector의 수정하지 않는 동작들

동작

효과

c.size()

실제 원소의 개수를 반환한다

c.empty()

컨테이너가 비어있는지를 판단한다 (size()==0와 동일하나 더 빠르다).

c.max_size()

컨테이너가 가질 수 있는 최대 원소의 개수를 반환한다.

capacity()

재할당 없이 가질 수 있는 최대의 원소 개수를 반환한다

reserve()

용량이 충분하지 않다면 용량을 증가시킨다

c1 == c2

c1과 c2가 같은지 판단한다

c1 != c2

c1과 c2가 다른지 판단한다 ( !(c1==c2)와 동일하다 ).

c1 < c2

c1이 c2보다 작은지를 판단한다

c1 > c2

c1이 c2보다 큰지를 판단한다( c2<c1과 동일하다 ).

c1 <= c2

c1이 c2보다 작거나 같은지를 판단한다 ( !(c2<c1)와 동일하다 ).

c1 >= c2

c1이 c2보다 크거나 같은지를 판단한다 ( !(c1<c2)와 동일하다 ).


 

■ vector의 할당 관련 동작

동작

효과

c1 = c2

c2의 모든 원소들을 c1에 할당한다

c.assign(n, elem)

elem 원소의 n개의 복사본을 할당한다

c.assign(beg, end)

[beg,end) 범위의 원소를 할당한다

c1.swap(c2)

c1과 c2의 데이터를 교체한다.

swap(c1,c2)

동일하다(전역 함수).


 

■ vector의 원소의 직접적인 액세스

동작

효과

c.at(idx)

인덱스가 idx인 원소를 반환한다

(만약 idx가 범위를 벗어났다면 범위 에러 예외를 발생시킨다)

c[idx]

인덱스가 idx인 원소를 반환한다(에러 검사를 하지 않는다)

c.front()

첫 번째 원소를 반환한다(원소가 있는지 검사하지 않는다)

c.back()

마지막 원소를 반환한다(원소가 있는지 검사하지 않는다)


 

■ vector의 반복자 함수들

동작

효과

c.begin()

첫 번째 원소를 가리키는 랜덤 액세스 반복자를 반환한다

c.end()

맨 마지막 원소 뒤를 가리키는 랜덤 액세스 반복자를 반환한다

c.rbegin()

역방향에서 첫 번째 원소의 역방향 반복자를 반환한다

c.rend()

역방향에서 마지막 원소 뒤를 가리키는 역방향 반복자를 반환한다


 

■ vector 원소의 삽입 및 제거 동작

동작

효과

c.insert(pos,elem)

반복자 pos위치에 elem의 복사본을 삽입한다

그리고 새로운 원소의 위치를 반환한다

c.insert(pos,n,elem)

elem의 n개의 복사본을 반복자 pos 위치에 삽입한다. 반환값은 없다.

c.insert(pos,beg,end)

[beg,end) 범위의 모든 원소들을 복사하여 반복자 pos 위치에 삽입한다.

반환값은 없다.

c.push_back(elem)

끝부분에 elem의 복사본을 추가한다.

c.pop_back()

마지막 원소를 제거한다(제거된 원소를 반환하지 않는다.)

c.erase(pos)

반복자 pos 워치의 원소를 제거한다. 그리고 다음 원소의 위치를 반환한다.

c.erase(beg,end)

[beg,end)범위의 모든 원소들을 제거한다. 그리고 다음 원소의 위치를 반환

c.resize(num)

원소의 개수를 num개로 변경한다

(만약 size()가 증가된다면, 새로운 원소들은 그들의 디폴트 생성자에 의해서 생성된다.)

c.resize(num,elem)

원소의 개수를 num개로 변경한다

(만약 size()가 증가된다면, 새로운 원소는 elem의 복사본이다).

c.clear()

모든 원소들을 제거한다(빈 컨테이너로 만든다).

'C++ > STL-vector' 카테고리의 다른 글

vector-소스 한개  (0) 2012.08.13