容器vector和list基本函式
建構函式
語法:
vector <string> v1(10,"a"); //建立型別為srting的容器,個數為10,內容為a,內容數量可省略 vector <string> v2(v1); //建立一個和V1一樣的容器 vector <string> v3{"a","b","c","d"}; //建立一個容器且,全部初始化 vector <string> v4; //建立一個空白容器 vector <string>::iterator itr; //建立一個指向的迭代器 vector <string> v5(v1.begin(),v1.end()-8,v1.get_allocator()); //建立一個容器,使用開始和結尾的地址 vector <int> v6(10,6); |
C++ Vectors可以使用以下任意一種引數方式構造:
無引數 - 構造一個空的vector,
數量(num)和值(val) - 構造一個初始放入num個值為val的元素的Vector
vector(from) - 構造一個與vector from 相同的vector
迭代器(start)和迭代器(end) - 構造一個初始值為[start,end)區間元素的Vector(注:半開區間).
運算子
語法:
v1 == v2 v1 != v2 v1 <= v2 v1 >= v2 v1 < v2 v1 > v2 v[] |
C++ Vectors能夠使用標準運算子: ==, !=, <=, >=,<, 和 >. 要訪問vector中的某特定位置的元素可以使用 [] 操作符.
兩個vectors被認為是相等的,如果:
它們具有相同的容量
所有相同位置的元素相等.
vectors之間大小的比較是按照詞典規則. (a>A)
語法:
v4.assign(v2.begin(),v2.end()); //assign會從後面的指標中從頭到尾的複製資料 v4.assign(1,"d"); //會從第一個位置複製制定個數的元素 |
assign() 函式要麼將區間[start, end)的元素賦到當前vector,或者賦num個值為val的元素到vector中.這個函式將會清除掉為vector賦值以前的內容.
at函式
語法:
cout << "v2 = " << v2.at(i) << endl; //at(i)會指向第i個位置的值,比直接a[i]安全。at()有邊界保護 |
at() 函式 返回當前Vector指定位置loc的元素的引用. at() 函式 比 [] 運算子更加安全, 因為它不會讓你去訪問到Vector內越界的元素.
begin-end 函式
語法:
for(itr = v1.begin();itr != v1.end();itr++) //使用迭代器指向v1,然後開啟迴圈 { //begin()指向起始元素的地址 cout << "vi = " << *itr << endl; //end()指向vector末尾元素的下一位置, *itr += 65; //注意,如果你要訪問末尾元素,需要先將此迭代器自減1. cout << "vi = " << *itr << endl; //使用字串會在值後面再加一個數值,數值等於加的值,使用int不會 } |
begin()函式返回一個指向當前vector起始元素的迭代器.
end() 函式返回一個指向當前vector末尾元素的下一位置的迭代器.注意,如果你要訪問末尾元素,需要先將此迭代器自減1.
語法:
v4.capacity(); //返回當前vector在重新進行記憶體分配以前所能容納的元素數量. |
capacity() 函式 返回當前vector在重新進行記憶體分配以前所能容納的元素數量.
clear 函式
語法:
v4.clear(); //刪除當前vector中的所有元素. |
clear()函式刪除當前vector中的所有元素.
empty 函式
語法:
b = v4.empty(); cout << "v4.empty? " << b << endl; //判斷容器是否為空,為空返回1,否則返回0 |
如果當前vector沒有容納任何元素,則empty()函式返回true,否則返回false.例如,以下程式碼清空一個vector,並按照逆序顯示所有的元素:
while( !v.empty() ) {
cout << v.back() << endl;
v.pop_back();
}
erase 函式
語法:
v3.erase(v3.begin(),v3.end()-3); //刪除指定區間的數值 v3.erase(itr = v3.begin()); //刪除制定位置的數值 |
erase函式要麼刪作指定位置loc的元素,要麼刪除區間[start, end)的所有元素.返回值是指向刪除的最後一個元素的下一位置的迭代器.
front-back 函式
語法:
cout << "v3.front = " <<v3.front() << endl; //front()會指向起始位置的數值 cout << "v3.end = " << v3.back() << endl; //back()會指向最後位置的數值 |
front()函式返回當前vector起始元素的引用
back() 函式返回當前vector最末一個元素的引用
語法:
allocator_type get_allocator(); |
get_allocator() 函式返回當前vector的記憶體分配器.
語法:
v5.insert(v5.begin(),"qw"); //在某一位置前插入一個數值, v5.insert(v5.end(),3,"w"); //在某一位置前插入n個位置 v5.insert(v5.begin(),v1.begin(),v1.end()); //在某一位置前插入另一一段地址的所有值 |
insert() 函式有以下三種用法:
在指定位置loc前插入值為val的元素,返回指向這個元素的迭代器,
在指定位置loc前插入num個值為val的元素
在指定位置loc前插入區間[start,end)的所有元素 .
語法:
int a = v1.max_size(); //最大的可能的元素個數. |
max_size() 函式返回當前vector所能容納元素數量的最大值(譯註:包括可重新分配記憶體).
語法:
v5.pop_back(); //刪除最後一個元素 |
pop_back()函式刪除當前vector最末的一個元素, vector<char>alphaVector;
語法:
v5.push_back("a"); //在最後面插入一個值 |
push_back()新增值為val的元素到當前vector末尾
語法:
rbegin函式返回指向當前vector末尾的逆迭代器.(譯註:實際指向末尾的下一位置,而其內容為末尾元素的值)
rend 函式
語法:
cout << *v6.rend()-1 <<endl; //返回指向當前vector末尾的逆迭代器,實際指向末尾的下一位置,而其內容為末尾元素的值 |
rend()函式返回指向當前vector起始位置的逆迭代器.
語法:
v6.reserve(10); //當前vector預留至少共容納size個元素的空間.(譯註:實際空間可能大於size) |
reserve()函式為當前vector預留至少共容納size個元素的空間.(注:實際空間可能大於size)
語法:
v6.resize(18,10000); //擴充為制定大小,但是不能比resize小, |
resize() 函式改變當前vector的大小為size,且對新建立的元素賦值val
size 函式
語法:
for(i = 0;i < v5.size() ;i++) //size() 函式返回當前vector所容納元素的數目 |
size() 函式返回當前vector所容納元素的數目
swap 函式
語法:
v5.swap(v1); //交換兩個容器的數值 |
swap()函式交換當前vector與vector from的元素
本質上還是呼叫了rease,remove_if是將要刪除的東西排到後面,並指向第一個刪除的位置
list
list是一個能夠存放任意型別的雙向連結串列
建構函式:
string arr[3] = {"abc","bcd","efg"}; list <string> L1; //建立一個空的list連結串列 list <string> L2(10); //建立一個元素個數為10的list連結串列 list <string> L3(10,"abc"); //建立一個元素個數為10的,內容為“abc”的list連結串列 list <string> L4(L3); //建立一個和L3一樣的list連結串列 list <string> L5(arr,arr+3); //利用陣列建立一個的list連結串列 list <string>::iterator itr; //建立一個迭代器 |
語法:
L2.assign(L3.begin(), L3.end()); //利用L3給L2賦值 L2.assign(6,"a"); //給連結串列從開始位置賦n個值,會覆蓋之前數值 |
assign()函式以迭代器start和end指示的範圍為list賦值或者為list賦值num個以val為值的元素。
語法:
cout << "L5.front = " << L5.front() << endl; //指向最開始的元素 cout << "L5.back = " << L5.back() << endl; //指向最末尾的元素 |
front()函式返回一個引用,指向連結串列的第一個元素。
back()函式返回一個引用,指向list的最後一個元素。
語法:
cout << "L2 = "; //給連結串列從開始位置賦n個值,會覆蓋之前數值 for( itr = L2.begin(); itr != L2.end(); itr++ ) //迭代器begin指向連結串列開始地址 cout << *itr << " "; //迭代器end指向連結串列末尾地址 |
begin()函式返回一個迭代器,指向list的第一個元素。
end()函式返回一個迭代器,指向連結串列的末尾(並不是最後一個元素)。
clear
語法:
L5.clear(); //清空列表 |
clear()函式刪除list的所有元素。
empty
語法:
cout << "L5 = empty? " << L5.empty() <<endl; //判斷連結串列是否為空,為空返回1,不空返回0 |
erase
語法:
L5.erase(L5.begin()); //刪除某一個位置的數值 L5.erase(L5.begin(),L5.begin()end ); //刪除從begin到end的數值 |
erase()函式刪除以pos指示位置的元素, 或者刪除start和end之間的元素。 返回值是一個迭代器,指向最後一個被刪除元素的下一個元素。
語法:
allocator_type get_allocator(); |
get_allocator()函式返回連結串列的配置器。
語法:
L5.insert(L5.begin(),"start"); //指定位置插入一個數值 L5.insert(L5.begin(),6,"qwer"); //指定位置插入N個數值 L5.insert(L5.begin(),L4.begin(),L4.end ); //指定位置插入另外一個連結串列的數值 |
insert()插入元素val到位置pos,或者插入num個元素val到pos之前,或者插入start到end之間的元素到pos的位置。返回值是一個迭代器,指向被插入的元素。
語法:
cout << "L5.max_size() = " << L5.max_size() << endl; //返回可儲存的最大個數 |
max_size()函式返回連結串列能夠儲存的元素數目。
merge
語法:
L5.merge(L4); //將L4和L5排列成一個連結串列。L4在前 L5.merge( L4, Comp compfunction ); |
merge()函式把自己和lst連結串列連線在一起,產生一個整齊排列的組合連結串列。如果指定compfunction,則將指定函式作為比較的依據。
語法:
L5.pop_front(); //刪除最開始位置的元素 L5.pop_back(); //刪除最末尾位置的元素 |
pop_back()函式刪除連結串列的最後一個元素。
pop_front()函式刪除連結串列的第一個元素。
語法:
L5.push_front("new-start"); //在最前端加數值 L5.push_back("end"); //在末尾加數值 |
push_front()函式將val連線到連結串列的頭部。
push_back()將val連線到連結串列的最後
語法:
cout << "*L5.rbegin() = " << *L5.rbegin(); //L5.rbgin指向連結串列末尾 L5.rend() //指向L5開頭,起始之前 |
rbegin()函式返回一個逆向迭代器,指向連結串列的末尾。
語法:
L5.remove("abc"); //刪除指定數值 |
remove()函式刪除連結串列中所有值為val的元素。例如
語法:
void remove_if( UnPred pr ); |
remove_if()以一元謂詞pr為判斷元素的依據,遍歷整個連結串列。如果pr返回true則刪除該元素。
語法:
L5.resize(10,"q"); //給L5重新分配可儲存大小 |
resize()函式把list的大小改變到num。被加入的多餘的元素都被賦值為val,可以省略val
語法:
L5.reverse(); //反轉連結串列中元素位置 |
reverse()函式把list所有元素倒轉。
size
語法:
cout << "L5.size = " << L5.size() << endl; //返回連結串列中元素個數 |
size()函式返回list中元素的數量。
sort
語法:
L5.sort(); //連結串列中元素排序 |
sort()函式為連結串列排序,預設是升序。如果指定compfunction的話,就採用指定函式來判定兩個元素的大小。
語法:
L5.splice(L5.end(),L2); //在指定位置連上另外一個連結串列 |
splice()函式把lst連線到pos的位置。如果指定其他引數,則插入lst中del所指元素到現連結串列的pos上,或者用start和end指定範圍。
swap
語法:
L2.swap(L5); //交換兩個連結串列的數值 |
swap()函式交換lst和現連結串列中的元素。
語法:
L2.unique(); //刪除重複元素 void unique( BinPred pr ); |
unique()函式刪除連結串列中所有重複的元素。如果指定pr,則使用pr來判定是否刪除。