set 容器與 map 非常類似。區別在於,集合不存儲鍵/值對,在 set 中,值本身就是鍵。如果要存儲沒有顯示鍵的信息,但是又希望對元素以便快速插入、查找和刪除,此時 set 就很有用。
set 提供的接口與 map 的接口幾乎相同。主要區別是 set 沒有提供 operator [ ]。另外,盡管標准中沒有明確指出來,但是大多數實現指令都令 set iterator 等同於 const_iteraotr,因此不能通過 iterator 來修改 set 的元素。即使你的 STL 版本允許通過一個 iterator 修改 set 元素,也要避免這樣做,因為修改 set 中的元素(仍在容器中)會破壞有序順序。
集合示例:訪問控制列表
在計算機系統上實現基本安全的一種做法是通過訪問控制列表。系統上的每一個實體(如一個文件或一個設備)都有相應的允許訪問該實體的用戶列表。用戶一般只能由有特殊權限的用戶從一個實體的許可列表中增加和刪除用戶。在內部,set 容器提供了一個很不錯的方法來表示訪問控制列表。可以對應每個實體有一個 set ,其中包括允許 訪問該實體的所有用戶名。下面是一個簡單的訪問控制列表的類定義。
[cpp]
#include<set>
#include<string>
#include<list>
using std::set;
using std::string;
using std::list;
class AccessList
{
public:
AccessList(){}
//adds the user to the permission list
void addUser(const string& user);
//remove the user from the permission list
void removeUser(const string& user);
//returns true if user is in the permission list
bool isAllowed(const string& user) const;
//returns a list of all the users who have permissions
list<string> getAllUsers() const;
protected:
set<string> mAllowed;
}
#include<set>
#include<string>
#include<list>
using std::set;
using std::string;
using std::list;
class AccessList
{
public:
AccessList(){}
//adds the user to the permission list
void addUser(const string& user);
//remove the user from the permission list
void removeUser(const string& user);
//returns true if user is in the permission list
bool isAllowed(const string& user) const;
//returns a list of all the users who have permissions
list<string> getAllUsers() const;
protected:
set<string> mAllowed;
}
以下是方法的定義:
[cpp]
#include "AccessList.h"
using namespace std;
void AccessList::addUser(const string& user)
{
mAllowed.insert(user);
}
void AccessList::removeUser(const string& user)
{
mAllowed.erase(user);
}
bool AccessList::isAllowed(const string& user) const
{
return (mAllowed.count(user)==1);
}
list<string> AccessList::getAllUsers() const
{
list<string> users;
users.insert(users.end(),mAllowed.begin(),mAllowed.end());
return (users);
}
#include "AccessList.h"
using namespace std;
void AccessList::addUser(const string& user)
{
mAllowed.insert(user);
}
void AccessList::removeUser(const string& user)
{
mAllowed.erase(user);
}
bool AccessList::isAllowed(const string& user) const
{
return (mAllowed.count(user)==1);
}
list<string> AccessList::getAllUsers() const
{
list<string> users;
users.insert(users.end(),mAllowed.begin(),mAllowed.end());
return (users);
}
以下是一個簡單的測試程序:
[cpp]
#include "AccessList.h"
#include<iostream>
#include<iterator>
using namespace std;
int main()
{
AccessList fileX;
fileX.addUser("nsolter");
fileX.addUser("klep");
fileX.addUser("baduser");
fileX.removeUser("baduser");
if(fileX.isAllowed("nsolter"))
{
cout<<"nsolter has permission!"<<endl;
}
if(fileX.isAllowed("baduser"))
{
cout<<"baduser has permission!"<<endl;
}
list<string> users = fileX.getAllUsers();
for(list<string>::const_iterator it = users.begin();
it !=users.end(); ++it)
{
cout<<*it<<" ";
}
cout << endl;
return 0;
}
#include "AccessList.h"
#include<iostream>
#include<iterator>
using namespace std;
int main()
{
AccessList fileX;
fileX.addUser("nsolter");
fileX.addUser("klep");
fileX.addUser("baduser");
fileX.removeUser("baduser");
if(fileX.isAllowed("nsolter"))
{
cout<<"nsolter has permission!"<<endl;
}
if(fileX.isAllowed("baduser"))
{
cout<<"baduser has permission!"<<endl;
}
list<string> users = fileX.getAllUsers();
for(list<string>::const_iterator it = users.begin();
it !=users.end(); ++it)
{
cout<<*it<<" ";
}
cout << endl;
return 0;
}
對於以上的代碼,,,在VC 6.0 中編譯的時候老是報 " error C2143: syntax error : missing ';' before 'namespace'"這個錯誤,,,,檢查了N多遍都找不出為什麼會提示這個錯誤,,,郁悶!!