程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> STL關聯容器—set

STL關聯容器—set

編輯:C++入門知識

 


  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多遍都找不出為什麼會提示這個錯誤,,,郁悶!!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved