文章目錄
set中每個元素最多隻出現一次,並且set中的元素已經從小到大排好序。
set 基本操作:
- begin() 返回set容器的第一個元素的地址
- end() 返回set容器的最後一個元素地址
- clear() 刪除set容器中的所有的元素
- empty() 判斷set容器是否爲空
- max_size() 返回set容器可能包含的元素最大個數
- size() 返回當前set容器中的元素個數
- erase(it) 刪除迭代器指針it處元素
- insert() 在set中插入元素(set中不存在)set中存在則插入無效
- count() :用來查找set中某個元素出現的次數。這個函數在set並不是很實用,因爲一個鍵值在set只可能出現0或1次,這樣就變成了判斷某一鍵值是否在set出現過了。
- find(): 用來查找set中某個元素出現的位置。如果找到,就返回這個元素的迭代器,如果這個元素不存在,則返回 s.end() (最後一個元素的位置,s爲set的變量名)
#include <iostream>
#include <set>
using namespace std;
#include<string>
struct Info
{
string name;
double score;
bool operator < (const Info &a) const // 重載“<”操作符,自定義排序規則
{
//按score由大到小排序。如果要由小到大排序,使用“>”即可。
return a.score > score;
}
};
int main()
{
set<int> s;
set<int>::iterator it1; //此處set的迭代器類似於 指針變量
s.insert(1);
s.insert(2);
s.insert(3);
s.insert(1);
cout<<"set 的 size 值爲 :"<<s.size()<<endl; // --> 3
cout<<"set 的 maxsize的值爲 :"<<s.max_size()<<endl; // --> 461168601842738790
cout<<"set 中的第一個元素是 :"<<*s.begin()<<endl; // --> 1
cout<<"set 中的最後一個元素是:"<<*s.end()<<endl; // --> 3
for(set<int>::iterator it = s.begin(); it != s.end(); ++it) //遍歷 set
{
cout<< *it << endl;
}
s.clear(); // 清除set ,此時 s.empty() 爲真
if(s.empty())
{
cout<<"set 爲空 !!!"<<endl;
}
cout<<"set 的 size 值爲 :"<<s.size()<<endl;
cout<<"set 的 maxsize的值爲 :"<<s.max_size()<<endl; // 461168601842738790
it1 = s.find(4); //查找數據
//如果沒找到就輸出set最後一個元素,找到就輸出該元素
cout << *it1 << endl; // --> s.end() 3
// s.clear();
//在聲明set<int> s 之後不能夠重複聲明 set<Info> s 即便在之前使用s.clear()也不行
set<Info> sinfo;
Info info;
//插入三個元素
info.name = "Jack";
info.score = 80;
sinfo.insert(info);
info.name = "Tom";
info.score = 99;
sinfo.insert(info);
info.name = "Steaven";
info.score = 60;
sinfo.insert(info);
set<Info>::iterator it;
for(it = sinfo.begin(); it != sinfo.end(); it++)
cout << (*it).name << " : " << (*it).score << endl;
// Steaven : 60
// Jack: 80
// Tom: 99
return 0;
}
vector中的內存爲自動分配,依據需求分配
vector 基本操作:
- push_back() 在數組的最後添加一個數據
- pop_back() 去掉數組的最後一個數據
- at() 得到編號位置的數據
- begin() 返回一個迭代器,它指向容器vector的第一個元素
- end() 返回一個迭代器,它指向容器c的最後一個元素的下一個位置
- front() 得到數組頭的引用
- back() 得到數組的最後一個單元的引用
- max_size() 得到vector最大可以是多大
- capacity() 當前vector分配的大小
- size() 當前使用數據的大小
- resize() 改變當前使用數據的大小,如果它比當前使用的大,者填充默認值
- reserve() 改變當前vecotr所分配空間的大小
- erase() 刪除指針指向的數據項
- clear() 清空當前的vector
- rbegin() 返回一個逆序迭代器,它指向容器c的最後一個元素
- rend() 返回一個逆序迭代器,它指向容器c的第一個元素前面的位置
- empty() 判斷vector是否爲空
- swap() 與另一個vector交換數據
vector 中的pop_back 是去掉最後一個元素, queue 中的pop 去除首元素
代碼演示 push_back、pop_back、end、begin、size、capacity
#include <iostream>
#include <vector>
using namespace std;
#include<string>
int main()
{
vector<int> v;
//vector<int> v={0,1,2,3}; //等同於for循環的push_back初始化,不過{}賦初值爲c++11新特性
int len = 4;
for(int i=0; i<len; i++)
{
v.push_back(i);
// v[i] = i; //不可以這種方式對vector進行初始化
}
for(vector<int>::iterator it=v.begin(); it!=v.end(); it++)
{
cout<< *it << " ";
}
cout<< endl;
cout<<"v.capacity() : " << v.capacity() <<endl; // --> 4
//v.end()返回vector 最後一個元素後的指針
cout<<"v.end() : " << *v.end() << endl; // --> 0
v.pop_back();
cout<<"v.capacity() : " << v.capacity() <<endl; // --> 4
cout<<"v.end() : " << *v.end() << endl; // --> 3
cout<<"v.size() : " << v.size() <<endl; // --> 3
for(int i = 0; i<v.size(); i++)
{
cout<< v[i] <<" ";
}
// --> 0 1 2
cout<<endl;
cout<<"v.begin(): "<< *v.begin() <<endl; // --> 0
//如果聲明一個 iterator 接受 v.rbegin()則會出錯;因爲v.rbegin()返回的是一個逆向迭代器
for(vector<int>::reverse_iterator it=v.rbegin(); it!=v.rend(); it++)
{
//逆向遍歷 vector
cout<< *it << " ";
}
cout<<endl;
for(vector<int>::reverse_iterator it=v.rend()-1; it!=v.rbegin()-1; --it)
{
//使用反向迭代器正向遍歷 vector
cout<< *it << " ";
}
cout<<endl;
v.back() = 22;
cout<<v.back()<<endl; //最後一個元素的引用
}
排序vector時,從大到小,從小到大的排序
//從大到小
sort(vec.begin(), vec.end());
// sorts in reverse: puts smallest element at the end of vec
sort(vec.rbegin(), vec.rend());
圖文示例 begin()、end()、rbegin()、rend()
反向迭代器圖示:
流迭代器不能使用反向迭代器
使用迭代器找到第一個單詞:
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
string line = {"FIRST,MIDDLE,LAST"};
string::iterator comma = find(line.begin(), line.end(), ',');
cout << string(line.begin(), comma) << endl; // --> FIRST
return 0;
}
但是想用 定位最後一個單詞,使用下邊代碼則出錯
// find last element in a comma-separated list
string::reverse_iterator rcomma = find(line.rbegin(), line.rend(), ',');
// wrong: will generate the word in reverse order
cout << string(line.rbegin(), rcomma) << endl;
// 此時出錯,因爲流迭代器不能使用反向迭代器
應該使用
string::reverse_iterator rcomma = find(line.rbegin(), line.rend(), ',');
cout << string(rcomma.base(), line.end()) << endl; // --> LAST
代碼示例 remove 和 erase
erase()返回的迭代器指向刪除元素的下一個元素所在地址
erase有兩種用法:
- erase( iterator _Where); 刪除迭代器所指的元素
- erase( iterator _First, iterator _Last); 刪除兩個迭代器中間的元素(下例使用)
#include <iostream>
#include <memory>
#include <vector>
#include <algorithm> // 包含remove
using namespace std;
int main()
{
vector<int> c = {1,2,3,4,5,1,7,8,9,10,12}; //c++11使用{}賦初值的新特性
cout << "size : " << c.size() << endl;
vector<int>::iterator it = remove(c.begin(), c.end(), 1);
//stl中的remove僅僅是將需要刪除的數移除,後邊的數挨個向前移,然後vector長度不變
//返回的迭代器指向需要刪除的元素的地址
cout << "size : " << c.size() << endl;
for(vector<int>::iterator itv = c.begin(); itv!=c.end(); itv++)
{
cout<< *itv << " ";
}
cout<<endl;
// 輸出 2 3 4 5 7 8 9 10 12 10 12
// 迭代器指向的是第二個10 所在的地址
c.erase(it,c.end());
for(vector<int>::iterator itv = c.begin(); itv!=c.end(); itv++)
{
cout<< *itv << " ";
}
cout<< endl;
// 輸出 2 3 4 5 7 8 9 10 12
}
參考鏈接:
set用法:https://www.cnblogs.com/yaoyueduzhen/p/4536929.html
反向迭代器:https://blog.csdn.net/kjing/article/details/6936325#
vector中的erase:https://www.cnblogs.com/zsq1993/p/5930229.html
c++11大括號初始化新特性:http://www.cnblogs.com/xiaozz/p/6448247.html