容器(下)
(面試題)什麼是迭代器的範圍
迭代器是STL提供的對一個容器的對象訪問方法,並且定義了容器中對象的範圍。迭代器就如同一個指針,但是,迭代器不僅僅是指針,因此不能認爲迭代器一定具有地址值。
迭代器類似與指針一樣,能夠使用*操作符類獲取數據。還可以使用自增操作符和+、-運算符對迭代器進行操作,用以訪問容器中的對象。迭代器有2個是已經定義好的,一個是begin,另一個是end。可以通過容器的begin()操作和end()操作獲取這兩個位置。其中begin指向容器中的第一個元素,end指向的是容器中的最後一個元素的下一個位置,也就是說end所指向的並不是容器的元素。通常begin和end之間的範圍就是迭代器的範圍。
#include <iostream>
#include <vector>
using namespacestd;
int main(){
vector<int> v;
v.push_back(2);
v.push_back(1);
vector<int>::iterator first = v.begin();
//vector<int>::iteratorlast = v.end();
//在使用迭代器之前,不應該存儲操作end()的返回值,因爲如果再保存了end()的返回之後,
//又對容器的元素進行插入和刪除,所以這樣使用的話,將會導致end()迭代器失效。
while(first!=v.end())
{
inti = *first;
v.push_back(1);
first++;
}
return0;
}
(面試題)什麼是關聯容器
關聯容器是能夠通過鍵值(關鍵字)來查找和讀取元素的容器。在STL中有4個 關聯容器,分別是map和set、multimap和multiset容器。
map的元素是“鍵-值”對的二元組形式即鍵用作元素在map中的索引,而值則表示所存儲和讀取的數據。set僅包含一個鍵,並有效地支持關於某個鍵是否存在的查詢。set和map類型的對象所包含的元素都具有不同的鍵,如果需要一個鍵對應多個實例,則需要使用multimap或multiset類型。這兩種類型允許多個元素擁有相同的鍵。
set是一個容器,它其中所包含的元素的值是唯一的。集合中的元素按照一定的順序排列,並被作爲集合中的實例。一個集合通過一個鏈表來組織,在插入操作和刪除操作上比vector快,但查找或添加操作末尾的元素時會有些慢。
#include <iostream>
#include <string>
#include <set>
using namespacestd;
int main()
{
set<string>strset;
set<string>::iterator si;
strset.insert("1");
strset.insert("2");
strset.insert("3");
strset.insert("4");
strset.insert("5");
strset.insert("6");
for(si = strset.begin(); si != strset.end();si++)
{
cout<< *si << " ";
}
cout<< endl;
return0;
}
set容器和multiset容器的區別:
set<int>strset; //聲明set變量
strset.insert(1); //往set中插入兩條相同的數據,這是不允許的
strset.insert(1);
multiset<int>mset;
mset.insert(1); //聲明multiset變量
mset.insert(1); //往multiset中插入兩條相同的數據,這是可以的