set+ vector的詳解及用法


Set 的用法總結:
 
//======================
/*C++STL之set的基本操作
//2015-04-1321:05 by itwolf, 1943 閱讀, 0 評論, 收藏, 編輯
set是集合,雖然也存在鍵值和實值,不過兩者根本就是同一個值,鍵值的設置完全就是爲了滿足紅黑樹的底層結構,set操作與map很像不過也有些不同。
1、set迭代器與map的不同:
(1)set使用接引用運算符*取值,而map使用first和second取值。
(2)set的迭代器都是常量迭代器,不能用來修改所指向的元素,而map的迭代器是可以修改所指向元素的。
2、set沒有重載[]運算符,而map中重載了,因爲直接使用[]改變元素值會打亂原本正確的順序,要改變元素值必須先刪除舊元素,則插入新元素
3、構造的類型不一樣,如同樣實值爲int類型分別爲set<int>和map<type,int>(其中type可以爲任意類型)
其他如插入、刪除、查找等操作與map幾乎一樣
*/
 

#include<iostream>
#include<set>
using namespace std;
voidprint(set<int>set_int)
{
set<int>::iteratorit=set_int.begin();
for(;it!=set_int.end();it++)
cout<<*it<<" ";           //循環輸出  set容器裏面的元素是被排好序之後進行的輸出!!!!!重要!!!!
 
cout<<endl;
}
int main()
{
intnum[4]={1,2,3,4};
set<int>set_int(num,num+4);
 
set_int.insert(5); //代表了插入一個元素 並且輸出set集合裏面的值
                ////2,在pos位置之前插入value,返回新元素位置,但不一定能插入成功
    //iterator insert(&pos, value)
 
print(set_int);
 
set_int.insert(5);
print(set_int);
 
//元素刪除
 
set_int.erase(3);//1. 移除set容器中的所有爲3的元素值 並返回元素的個數
                     //2.voiderase(&pos)   //移除pos位置上的元素 無返回值
                     //3.void erase(&first,&last) 移除迭代區間【&first,last)內的元素無返回值
//4.void clear();  移除set容器中的所有元素
print(set_int);
 
//元素查找
//count(value)返回set對象內元素之爲value的元素個數
//iterator find(value)返回value所在位置,找不到value將返回end();
//lower_bound(value)表示返回大於等於value的第一個元素的下標   upper_bound(value),qual_range(value);
 
int a[5]={8,4,5,5,5};       // 當你的數組中有重複的元素時放入set容器輸出直接將重複的刪除
set<int>v4(a,a+5);
print(v4);
//--------------以下查找函數  返回的值的下標是不對的!!!!!!!! 建議先不使用該函數-------------
set<int>::iteratorit;   
it=v4.find(5);   //it爲5所在下標的位置
cout<<*it<<endl;         //因爲it是一個迭代器(指針) 所以需要加一個  *   表示該指針指向變量的值
 
set<int>::iteratorq;
q=set_int.find(2);      //搞不懂輸出的是麻子
cout<<*q<<endl;
q=set_int.find(8);       // 同上
cout<<*q<<endl;
    //------------- 截至到以上是查找函數  ------------
 
 
         return0;
}
 


以下給予的是C++stl容器set成員函數:
begin()--返回指向第一個元素的迭代器
clear()--清除所有元素
count()--返回某個值元素的個數
         empty()--如果集合爲空,返回true
end()--返回指向最後一個元素的迭代器
equal_range()--返回集合中與給定值相等的上下限的兩個迭代器
erase()--刪除集合中的元素
find()--返回一個指向被查找到元素的迭代器
get_allocator()--返回集合的分配器
insert()--在集合中插入元素
lower_bound()--返回指向大於(或等於)某值的第一個元素的迭代器
key_comp()--返回一個用於元素間值比較的函數
max_size()--返回集合能容納的元素的最大限值
rbegin()--返回指向集合中最後一個元素的反向迭代器
rend()--返回指向集合中第一個元素的反向迭代器
size()--集合中元素的數目
swap()--交換兩個集合變量
upper_bound()--返回大於某個值元素的迭代器
value_comp()--返回一個用於比較元素間的值的函數
lower_bound(key_value)?,返回第一個大於等於key_value的定位器
upper_bound(key_value),返回最後一個大於等於key_value的定位器


三.自定義比較函數
1.元素不是是結構體
 
 
        struct myComp
        {
            bool operator()(const your_type&a,const your_type &b)
            [
                return a.data-b.data>0;
            }
        }
        set<int,myComp>s;
        ......
        set<int,myComp>::iterator it;
       
       
如果元素是結構體,可以直接將比較函數寫在結構體內
        struct Info
        {
            string name;
            float score;
            //重載“<”操作符,自定義排序規則
            bool operator < (const Info&a) const
            {
                //按score從大到小排列
                return a.score<score;
            }
        }
        set<Info> s;
        ......
        set<Info>::iterator it;
 
 
 
Vector 的用法總結:

#include<iostream>
using namespace std;
#include<vector>
#include<string>
#include<algorithm>
 
int main()
{
stringstr[]={"Alex","John","Robert"};
vector<int> v1;//   創建一個空vector容器
vector<int> v2(10);  //創建一個有10個空元素的vector容器
vector<int> v3(10,0); //創建一個有10個元素的vector容器,並賦值爲0;
vector<string> v4(str,str+3);  //根據字符串數組創建vector容器
 
 
vector<string>::iterator e = v4.begin();   //迭代器法遍歷
while(e!=v4.end())
{
cout<<*e++<<"";
}
cout<<endl;
 
vector<string> v5(v4);  //拷貝構造
 
for(int i=0;i<3;i++) //下標遍歷
cout<<v5[i]<<"";
cout<<endl;
 
return0;
}


 [STL]vector基本用法
 
vector的數據安排以及操作方式,與array非常相似。兩者的唯一區別在於空間的運用的靈活性。array是靜態空間,一旦配置了就不能改變。vector是動態空間,隨着元素的加入,它的內部機制會自行擴充空間以容納新元素。因此,vector的運用對於內存的合理利用與運用的靈活性有很大的幫助,我們再也不必因爲害怕空間不足而一開始要求一個大塊的array。
 
vector動態增加大小,並不是在原空間之後持續新空間(因爲無法保證原空間之後尚有可供配置的空間),而是以原大小的兩倍另外配置一塊較大的空間,然後將原內容拷貝過來,然後纔開始在原內容之後構造新元素,並釋放原空間。因此,對vector的任何操作,一旦引起空間重新配置,指向原vector的所有迭代器就都失效了。


int main()
{
inti=0;
for(;i<25;i++)   //向容器中填充數據
{
v4.push_back(1);
}
 
v4.resize(400);   // 將容器的大小改爲400  可以存放400個數據
 
 
class act   //定義一個存放class的容器
{
};
vector<act>v4;
 
vector<int> v4(100,0)   //定義100個int型數據並都給賦值爲0
 
vector<int> v4(100,0); //將v4的內容全部賦值給v3;
vector<int>v3(v4); 


#include<vector>        //頭文件應該定義爲
 
using std::vector或者using namespacestd或者不用定義,直接在使用vector的代碼前使用std::加vector<int>v4;           //vector屬於std命名域的,因此需要通過命名限定,可以在文件開頭加上

std::vector<int> v4;//定義一個vector
 
//以下爲vector可以使用的功能
v4.clear()  // 移除容器中所有數據。
v4.empty()   //判斷容器是否爲空
v4.erase(pos) //刪除pos位置的數據
v4.erase(beg,end) //刪除【beg,end)區間的數據
v4.front()    //傳回第一個數據
v4.insert(pos,elem) //在pos位置插入一個elem拷貝
v4.pop_back()  //刪除最後一個數據
v4.push_back(elem)  //在尾部加入一個數據
v4.resize(num)  //改容器的大小
v4.size()  //返回容器中實際數據的個數
v4.begin() //返回指向容器第一個元素的迭代器
v4.end()  //返回指向容器最後一個元素的迭代器
 
 
 下面介紹什麼事迭代器
        //迭代器相當於指針
int a=10;//對於變量而言  使用指針指向對應的變量
int *p;  //以後就可以使用 * 加指針操作該變量了
p=&a;
 
//使用指針操作該變量
*p=11;   //操作後a變爲11
//對於容器使用迭代器操作容器中對應位置的值
//當迭代器指向了容器中的某位置,則可以使用 *加迭代器操作該位置了
std::vector<int> v4;   //定義一個vector
for(i=0;i<10;i++)
v4.push_back(j);  //添加10個變量  填入值隨變量j的變化而變化
 
std::vector<int>::iterator p; //定義一個迭代器  相當於定義一個指針
 
p=v4.begin(); //該(指針)迭代器指向容器的第一個元素
p++;  //  (指針) 迭代器移動至下一個元素(指向下一個元素)
 
*p=20;    //修改指向該元素的值   意味着容器中第二個值被修改爲20
 
p=v4.begin(); //循環掃描迭代器,改變所有值
for(;p!=v4.end();p++)
*p=50;
        以上爲vector的用法僅供入門只用 許多看多練習


#include<iostream>
#include<string>
#include<vector>
using namespace std;
void main()
{
inti=0;
vector<int> v;  //定義一個vector容器 v
 
for(i=0;i<10;i++)
v.push_back(i); // 元素放進vector中
 
    for(i=0;i<v.size();i++)
cout<<v[i]<<" ";  //輸出每個元素
cout<<endl;
}
 
/// 你也可以用v.begin()與v.end()來得到vector開始的和結束的元素地址的指針位置
 
vector<int>::iteratoriter;
for(iter=v.begin();iter!=v.end();iter++)
cout<<*iter<<endl;
 
//對於二維vector的定義
 定義一個10個vector元素,並對每個vector賦值1-10
 
 
#include<iostream>
#include<string>
#include<vector>
using namespace std;
void main()
{
inti=0;
vector<int> v;  //定義一個vector容器 v
 
for(i=0;i<10;i++)
v.push_back(i); // 元素放進vector中
 
    for(i=0;i<v.size();i++)
cout<<v[i]<<" ";  //輸出每個元素
cout<<endl;
}
 
/// 你也可以用v.begin()與v.end()來得到vector開始的和結束的元素地址的指針位置
 
vector<int>::iteratoriter;
for(iter=v.begin();iter!=v.end();iter++)
cout<<*iter<<endl;
 
//對於二維vector的定義
 定義一個10個vector元素,並對每個vector賦值1-10
 
 #include<vector>
 using namespace std;
 void main()
 {
         inti=0,j=0;
         vector<vector<int>>array(10,vetcor<int>(0));  //定義一個二維動態數組,有10行每一行使用一個vector儲存這一行數據
       //所以每一行的長度是可以變化的,之所以用到vector<int>(0)是對vector的初始化 否則不能對vector存入元素
       
       for(j=0;j<10;j++)
for(i=0;i<9;i++)
{
array[j].push_back(i);   //意思應該爲對與array【i(相當於有幾個vector元素)】同時一個vector含有10個元素
}
for(j=0;j<10;j++)
for(i=0;i<array[j].size();i++)
cout<<array[j][i]<<"";
cout<<endl;
}





// 定義一個行列都是變化的數組
 
#include<iostream>
#include<vector>
using namespace std;
int main()
{
inti=0,j=0;
vector<vector<int>>array;
 
vector<int>line;
 
for(j=0;j<10;j++)
{
array.push_back(line); //只有初始化之後才能存入元素
for(i=0;i<array[j].size();i++)
cout<<array[j][i]<<"";
}
cout<<endl;
}
 
#include<vector>
using namespace std;
int main()
{
vector<int>arr;
arr.push_back(6);
arr.push_back(8);
arr.push_back(3);
arr.push_back(8);
for(vector<int>::iteratorit=arr.begin();it!=arr.end();)
{
if(*it==8)
it=arr.erase(it); //刪除當前爲8的元素
else
++it;   //不爲8的化迭代器指向下一個地址
cout<<"AFTERremove 8:\n";
for(vector<int>::iteratorit=arr.begin();it<arr.end();++it)
cout<<*it<<"";
cout<<endl;
}







Upper_bound(p+1,p+1+n,n)(大於該元素的第一個元素的座標)  找到的東西是n元素所在的下標 概念表示爲(p+l)
要轉換爲該元素的下標應該減去 p+1 即爲爲該元素所在的下標





程序總結:
#include<iostream>
#include<set>
using namespace std;
void print(set<int>set_int)
{
	set<int>::iterator it=set_int.begin();
	for(;it!=set_int.end();it++)
		cout<<*it<<" ";           //循環輸出  set容器裏面的元素是被排好序之後進行的輸出 !!!!!重要!!!!

	cout<<endl;
}
int main()
{
	int num[4]={1,2,3,4};
	set<int>set_int(num,num+4);

	set_int.insert(5);  //代表了插入一個元素 並且輸出set集合裏面的值
                ////2,在pos位置之前插入value,返回新元素位置,但不一定能插入成功
			    //iterator insert(&pos, value)

	print(set_int);

	set_int.insert(5);
	print(set_int);

	//元素刪除

	set_int.erase(3);//1. 移除set容器中的所有爲3的元素值 並返回元素的個數
                     //2.void erase(&pos)   //移除pos位置上的元素 無返回值
                     //3.void erase(&first,&last) 移除迭代區間【&first,last) 內的元素 無返回值
					//4.void clear();   移除set容器中的所有元素
	print(set_int);

	//元素查找
			//count(value)返回set對象內元素之爲value的元素個數
			//iterator find(value)返回value所在位置,找不到value將返回end();
			//lower_bound(value)表示返回大於等於value的第一個元素的下標    upper_bound(value), qual_range(value);

	int a[5]={8,4,5,5,5};       //  當你的數組中有重複的元素時放入set容器輸出 直接將重複的刪除
	set<int>v4(a,a+5);
	print(v4);
	//--------------以下查找函數  返回的值的下標 是不對的!!!!!!!! 建議先不使用該函數-------------
	set<int>::iterator it;
	it=v4.find(5);    //it爲5所在下標的位置
	cout<<*it<<endl;         //因爲it是一個迭代器(指針) 所以需要加一個  *   表示該指針指向變量的值

	set<int>::iterator q;
	q=set_int.find(2);      //搞不懂輸出的是麻子
		cout<<*q<<endl;
	q=set_int.find(8);       // 同上
		cout<<*q<<endl;
    //------------- 截至到以上是查找函數  ------------


 	return 0;
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章