list 와 vector 는 어떤 차이 가 있 습 니까?

2654 단어
vector 는 배열 과 유사 합 니 다. 연속 적 인 메모리 공간 을 가지 고 시작 주소 가 변 하지 않 기 때문에 랜 덤 액세스 (즉, [] 연산 자 를 사용 하여 그 중의 요소 에 접근 하 는 것) 를 지원 할 수 있 습 니 다. 그러나 메모리 공간 이 연속 적 이기 때문에 중간 에 삽입 하고 삭제 하면 메모리 블록 의 복사 (복잡 도 는 O (n) 를 초래 할 수 있 습 니 다. 또한,이 배열 의 메모리 공간 이 부족 할 때 충분 한 메모 리 를 다시 신청 하고 메모리 복사 가 필요 합 니 다.이것들 은 모두 vector 의 효율 에 큰 영향 을 주 었 다.       list 는 데이터 구조의 양 방향 링크 로 이 루어 지기 때문에 메모리 공간 은 연속 되 지 않 을 수 있 습 니 다.따라서 포인터 로 만 데이터 에 접근 할 수 있 습 니 다. 이 특징 으로 인해 무 작위 액세스 가 매우 비효 율 적 이 고 중간 요 소 를 옮 겨 다 니 며 복잡 도 O (n) 를 검색 해 야 하기 때문에 [] 연산 자 를 다시 불 러 오지 않 았 습 니 다.그러나 링크 의 특징 으로 인해 임의의 삭제 와 삽입 을 효율 적 으로 지원 할 수 있 습 니 다.
list 와 vector 위의 이러한 차이 로 인해 list: iterator 와 vector:: iterator 도 약간 다르다.아래 의 예 를 보십시오.
#include <vector>
#include <list>
using namespace std;

int main( void )
{
    vector<int> v;
    list<int> l;

    for (int i=0; i<8; i++)     // v l       
    {
        v.push_back(i);
        l.push_back(i);
    }

    cout << "v[2] = " << v[2] << endl;
    //cout << "l[2] = " << l[2] << endl;       //    ,list    []
    cout << (v.begin() < v.end()) << endl;
    //cout << (l.begin() < l.end()) << endl;   //    ,list::iterator    < >
    cout << *(v.begin() + 1) << endl;

    vector<int>::iterator itv = v.begin();
    list<int>::iterator itl = l.begin();
    itv = itv + 2;
    //itl = itl + 2;                  //    ,list::iterator    +
    itl++;
    itl++;                    //list::iterator    ++,    ++      。
    cout << *itv << endl;
    cout << *itl << endl;

    return 0;
  
vector 는 연속 적 인 메모리 공간 을 가지 고 있 기 때문에 무 작위 접근 을 지원 할 수 있 습 니 다. 따라서 vector < int >: iterator 는 "+", "+ =", "<" 등 조작 자 를 지원 합 니 다.한편, list 의 메모리 공간 은 연속 되 지 않 을 수 있 습 니 다. 무 작위 접근 을 지원 하지 않 기 때문에 list < int >: iterator 는 "+", "+ =", "<" 등 연산 자 를 지원 하지 않 기 때문에 코드 20, 26 줄 에 컴 파일 오류 가 발생 할 수 있 습 니 다."+" 를 사용 하여 교체 할 수 있 습 니 다. 예 를 들 어 코드 27 줄, itl + 를 두 번 사용 하여 itl 을 이동 할 수 있 습 니 다.그리고 list 도 [] 연산 자 를 지원 하지 않 기 때문에 코드 18 줄 에 컴 파일 오류 가 발생 했 습 니 다.한 마디 로 하면 삽입 과 삭제 의 효율 에 신경 쓰 지 않 고 효율 적 인 액세스 가 필요 하 다 면 vector 를 사용 합 니 다.많은 삽입 과 삭제 가 필요 하 다 면 즉시 액세스 에 관심 이 없 으 면 list 를 사용 해 야 합 니 다.정 답: vector 는 연속 적 인 메모리 공간 을 가지 고 있 기 때문에 무 작위 접근 을 지원 합 니 다. 삽입 과 삭제 의 효율 에 신경 쓰 지 않 고 효율 적 인 접근 이 필요 하 다 면 vector 를 사용 하 십시오.
list 는 연속 되 지 않 는 메모리 공간 을 가지 고 있 기 때문에 무 작위 접근 을 지원 합 니 다. 많은 삽입 과 삭제 가 필요 하고 즉시 접근 에 관심 이 없 으 면 list 를 사용 해 야 합 니 다.
돌리다http://genwoxuevc.blog.51cto.com/1852984/503337

좋은 웹페이지 즐겨찾기