C++ STL의 가변 길이 배열 벡터에 대한 자세한 설명

Part.I 주의

여기에 이미지 설명 삽입

사용시 vector주의사항 :

  • 인용 추가#include <vector>
  • 바로 "배열"이라고 할 수 있지만! 함수의 값을 수정하려면 추가해야 합니다 &! ! !

몇 가지 요령:

// 将 b 中的元素去重并从小到大排序
sort(b.begin(),b.end());
b.erase(unique(b.begin(),b.end()),b.end());

II부 기능

여기에 이미지 설명 삽입

기능 목록:

함수 이름 의미
begin() 컨테이너의 첫 번째 요소를 가리키는 반복자를 반환합니다.
end() begin()일반적 으로 와 함께 사용되는 컨테이너의 마지막 요소 다음 위치를 가리키는 반복자를 반환합니다 .
rbegin() 마지막 요소를 가리키는 반복자를 반환합니다.
rend() 첫 번째 요소 위치 이전 위치를 가리키는 반복자를 반환합니다.
size() 실제 요소 수를 반환합니다.
max_size() 최대 요소 수를 반환합니다. 보통 232-1로 큰 값이므로 이 함수를 거의 사용하지 않습니다.
resize() 실제 요소 수를 변경합니다.
capacity() 현재 용량을 반환합니다.
empty() 컨테이너에 요소가 있는지 확인하고 요소가 없으면 true를 반환하고 그렇지 않으면 false를 반환합니다.
reserve() 용기의 용량을 늘립니다.
shrink _to_fit() 현재 요소에서 실제로 사용하는 크기와 같도록 메모리를 줄입니다.
운영자[] [ ] 연산자는 오버로드되며 벡터 컨테이너의 요소는 배열의 요소에 액세스하는 것과 같은 첨자를 통해 액세스하거나 수정할 수 있습니다.
at() 경계 확인 인덱스를 사용하여 요소에 액세스합니다.
front() 첫 번째 요소에 대한 참조를 반환합니다.
back() 마지막 요소에 대한 참조를 반환합니다.
data() 컨테이너의 첫 번째 요소에 대한 포인터를 반환합니다.
assign() 기존 콘텐츠를 새 요소로 바꿉니다.
push_back() 시퀀스의 끝에 요소를 추가합니다.
pop_back() 시퀀스의 끝에서 요소를 제거합니다.
insert() 지정된 위치에 하나 이상의 요소를 삽입합니다.
erase() 요소 또는 요소 블록을 밖으로 이동합니다.
clear() 모든 요소가 제거되고 컨테이너 크기가 0이 됩니다.
swap() 두 컨테이너의 모든 요소를 ​​교환합니다.
emplace() 지정된 위치에 직접 요소를 생성합니다.
emplace_back() 시퀀스의 끝에 요소를 생성합니다.

1장 생성자

  • vector(): 빈 벡터 생성
  • :vector(int nSize)​ 요소 개수 nSize로 벡터 생성
  • vector(int nSize,const t& t): 벡터를 만들고, 요소의 개수는 nSize, 값은 t
  • :vector(const vector&)​ 복사 생성자
  • vector(begin,end)​: [begin,end)범위에 있는 다른 배열의 요소를 벡터에 복사합니다.

다음은 생성자를 호출하는 예입니다.

// 定义了10个整型元素的向量,初始化为 1
vector<int> a(10,1); 	
// 定义一个二维 vector 向量,所有元素初始化为 1
vector<int> a(10,1);
vector<vector<int>> aa(10,a);
// 通过 int[] 构造并初始化 vector
int b[7] = {
    
    1,2,3,4,5,9,8}; 
vector<int> a(b,b+7);
// 直接用数组构造
vector<int> a({
    
    1,2,3,4,5,9,8});

Chap.II 기능 추가

  • void push_back(const T& x)​: 벡터 끝에 요소 X를 추가합니다.
  • ​iterator insert(iterator it,const T& x): 벡터의 반복자가 요소를 가리키기 전에 요소 x를 추가합니다.
  • ​iterator insert(iterator it,int n,const T& x): 벡터의 반복자가 요소를 가리키기 전에 n개의 동일한 요소 x를 추가합니다.
  • ​iterator insert(iterator it,const_iterator first,const_iterator last)​: 벡터의 반복자가 요소를 가리키기 전에 동일한 유형의 다른 벡터 [first,last)사이에 데이터를 삽입합니다.

다음은 간단한 작동 예입니다.

vector<int> a(10,1);	// 10个1
auto itr=a.begin()+3;	// 得到第 3 个迭代器
a.insert(itr,2,8);		// 在迭代器的位置处插入 2 个 8,a=[1  1  1  8  8  1  1  1  1  1  1  1]

3장 삭제 기능

  • iterator erase(iterator it)​: 벡터에서 반복자가 가리키는 요소를 삭제합니다.
  • ​iterator erase(iterator first,iterator last)​[first,last): 벡터 의 요소 삭제
  • void pop_back(): 벡터의 마지막 요소 삭제
  • ​void clear(): 벡터의 모든 요소를 ​​비웁니다.

다음은 간단한 작동 예입니다.

auto tmp=a.erase(a.begin()+2,a.begin()+4);
a.pop_back();		// 删除最后一个元素

vector첫 번째 문장의 의미: 3번째 요소에서 5번째 요소(포함되지 않음)까지 두 개의 요소가 삭제 되고 삭제 후 3번째 요소의 반복자가 반환됩니다.


Chap.IV 순회 함수

  • T at(int pos): 위치 pos에 있는 요소에 대한 참조를 반환합니다.
  • ​T front(): 첫 번째 요소에 대한 참조를 반환합니다.
  • ​T back(): 꼬리 요소에 대한 참조를 반환합니다.
  • ​iterator begin()​: 첫 번째 요소를 가리키는 벡터 헤드 포인터를 반환합니다.
  • ​iterator end()​: 벡터의 마지막 요소의 다음 위치를 가리키는 벡터 꼬리 포인터를 반환합니다.
  • reverse_iterator rbegin(): 역방향 반복자, 마지막 요소를 가리킴
  • ​reverse_iterator rend(): 첫 번째 요소 앞의 위치를 ​​가리키는 역 반복자

알아채다:

  • vector는 특정 인덱스의 요소 값을 가져오는 []데 사용할 있지만 python그렇게 슬라이스할 수는 없습니다.
  • end()*(vec.end()-1)마지막 요소의 값인 마지막 요소 뒤의 반복자를 반환합니다.
vector<int> b({
    
    1,2,3,4,5,6,7,8});
cout<<b.front()<<"  "<<b.back()<<endl;		// 1  8
cout<<*b.begin()<<"  "<<*(b.end()-1)<<endl;	// 1  8

Chap.V 판정/크기/기타 기능

  • bool empty() const: 벡터가 비어 있는지 확인, 비어 있으면 벡터에 요소가 없음
  • int size() const: 벡터의 요소 수를 반환합니다.
  • ​int capacity() const: 현재 벡터가 보유할 수 있는 최대 요소 값을 반환합니다.
  • ​int max_size() const​: 허용 가능한 최대 벡터 요소 수를 반환합니다.
  • void swap(vector&): 같은 타입의 두 벡터의 데이터 교환
  • ​void assign(int n,const T& x): 벡터의 처음 n개 요소의 값을 x로 설정
  • ​void assign(const_iterator first,const_iterator last): [first,last)벡터의 요소가 현재 벡터 요소로 설정됩니다.

	cout<<b.empty()<<endl;
    cout<<b.size()<<"  "<<b.capacity()<<"  "<<b.max_size()<<endl;
    printVec(b);
    b.assign(6,10);     // 指定 b 中的元素为6个10
    printVec(b);
    b.assign(b.begin()+1,b.end()-1); // 去掉 b 第一个元素和最后一个元素
    printVec(b);

Part.III 코드

다음은 Vector학습 과정에서 사용되는 코드입니다(사실 위 코드를 요약한 것입니다).

#include <iostream>
#include <iomanip>
#include <vector>

using namespace std;

int main()
{
    
    
    auto printVec=[](vector<int> vec) {
    
    for(auto& c:vec) cout << c << "  ";cout << endl;};
    // 构造
    vector<int> a(10,1);
    printVec(a);
    // 插入
    auto itr=a.begin()+3;
    auto tmp = a.insert(itr,2,8);
    cout << *(tmp+1)<<endl;
    printVec(a);
    // 删除
    tmp=a.erase(a.begin()+2,a.begin()+4);// 删除的元素不包含 itr+1
    cout <<* tmp<<endl;
    printVec(a);
    a.pop_back();
    printVec(a);
    // 修改
    a[3]=3;
    a.push_back(4);
    printVec(a);
    // 遍历
    vector<int> b({
    
    1,2,3,4,5,6,7,8});
    cout<<b.front()<<"  "<<b.back()<<endl;
    cout<<*b.begin()<<"  "<<*(b.end()-1)<<endl;
    // 其他函数
    cout<<b.empty()<<endl;
    cout<<b.size()<<"  "<<b.capacity()<<"  "<<b.max_size()<<endl;
    printVec(b);
    b.assign(6,10);     // 指定 b 中的元素为6个10
    printVec(b);
    b.assign(b.begin()+1,b.end()-1); // 去掉 b 第一个元素和最后一个元素
    printVec(b);
    getchar();
    return 0;
}

출력은 다음과 같습니다.

1  1  1  1  1  1  1  1  1  1
8
1  1  1  8  8  1  1  1  1  1  1  1
8
1  1  8  1  1  1  1  1  1  1
1  1  8  1  1  1  1  1  1
1  1  8  3  1  1  1  1  1  4
1  8
1  8
0
8  8  2305843009213693951
1  2  3  4  5  6  7  8
10  10  10  10  10  10
10  10  10  10

추천

출처blog.csdn.net/Gou_Hailong/article/details/128369496