vector

Annaprincess發表於2024-08-28

vector容器

1.遍歷

#include<bits/stdc++.h>
using namespace std;
int main(){
vector<int>a;
a.push_back(1);
a.push_back(2);
a.push_back(6);
a.push_back(8);
a.pop_back();

方法一:
for(auto i:a){
cout<<i<<'\t';
}


cout<<endl;

方法二:迭代器
cout<<"-------------------------"<<endl;
for(auto i=a.begin();i!=a.end();i++){//注意不能用i+=1要用++i或i++,還有因為是迭代器所以不能用><要用!=
cout<<*i<<'\t';
}


cout<<endl;
cout<<"-------------------------"<<endl;
vector<int>b={1,8,2};

方法三:
for(int i=0;i<b.size();i++){
cout<<b[i]<<'\t';
}


return 0;
}

2.排序去重

//排序去重
vector<int>a={1,2,2,3,4,9,9,1,4,2};
sort(a.begin(),a.end());//排序,從小到大預設-->1,1,2,2,2,3,4,4,9,9

auto t= unique(a.begin(),a.end());//unique函式作業將相同重複部分仍在最後面-->1,2,3,4,9,1,2,2,4,9-->並且返回第一個重複元素換後位置迭代器
    a.erase(t,a.end());//刪除重複元素
        for(auto i:a){
        cout<<i<<'\t';
    }//1,2,3,4,9
    cout<<endl;
    cout<<a.size();//5

3.增刪元素+判空

#include<bits/stdc++.h>
using namespace std;
int main(){
    vector<int>a;
    a.push_back(1);
    a.push_back(2);
    a.push_back(6);
    a.push_back(8);
    a.pop_back();//1,2,6
    //1.定點插入,其餘順延
    a.insert(a.begin()+1,9);//在第一個位置插入9
    for(auto i:a){
        cout<<i<<'\t';
    }//1,9,2,6
//2.定點刪除
a.erase(a.begin()+2);
cout<<endl;
cout<<"after delete"<<endl;
    for(auto i:a){
        cout<<i<<'\t';
    }//1,9,6
    cout<<endl;
if(a.empty()){//判空
    cout<<"before clear isempty"<<endl;
}
a.clear();
if(a.empty()){
    cout<<"after clear isempty"<<endl;
}
    return 0;
}

4.應用

問題:取原陣列偶數部分並且保持相對位置不變

//任務:刪除陣列中奇數元素並且不改變原來相對位置
#include<bits/stdc++.h>
using namespace std;
int main(){
vector<int>a={1,2,2,8,9,7,6,5,3,4,9,10,11}    ;
//為了高效採用原地建表不再開個陣列
/*方法1.整體建表
int k=0;//記錄偶數個數
for(int i=0;i<a.size();i++){
    if(a[i]%2==0){//保留偶數元素!
    a[k++]=a[i];//覆蓋
        
    }
}
for(int i=0;i<k;i++){
    cout<<a[i]<<'\t';
}*/
/*方法2:移動法
利用k統計當前元素前面有幾個奇數
int k=0;
for(int i=0;i<a.size();i++){
    if(a[i]%2==0){
        a[i-k]=a[i];
    }
    else{
        k++;//奇數個數
    }
}
for(int i=0;i<a.size()-k;i++){//a.size()-k-->偶數個數
    cout<<a[i]<<'\t';
}*/
//方法3: 分割槽間:偶數區間下標範圍[0,k],奇數區間下標範圍[k+1,a.size()-1]
int k=-1;
for(int i=0;i<a.size();i++){
    if(a[i]%2==0){
        k++;//應該放的位置
        swap(a[i],a[k]);
    }
}
a.resize(k+1);//擷取陣列要的部分-->前k+1個元素-->偶數
for(auto i:a){
    cout<<i<<'\t';
}
return 0;
}