std::setとstd::mapの基本的な使い方

5854 ワード


std::setメンバー関数および簡単な使用方法
関数#カンスウ#
宣言
説明
insert
pair insert(const value_type& x)
iterator insert(iterator position, const value_type& x)
1、集合に要素を追加する
2、反復器が指す位置に指定した要素を配置する
count
size_type count(const key_type& x)
コンテナ内の要素の数を計算します.std::setに対して1(存在)または0(存在しません)です.要素が存在するかどうかを判断するために使用できます.
find
指定の検索
empty
bool empty()
現在のコンテナが空かどうかを判断
size
size_type size()
現在のコンテナ内の要素の数を取得
clear
void clear()
現在のコンテナを空にする
begin
宣言
end
宣言
rbegin
宣言
rend
宣言
erase
void erase(iterator position)
void erase(iterator first, iterator last)
size_type erase(const key_type& x)
begin
宣言
begin
宣言
begin
宣言
begin
宣言
begin
宣言
begin
宣言
begin
宣言
現在のコンテナを空にする
現在のエレメントが自分のnewから出てきたオブジェクトのポインタである場合、clear関数を呼び出す前に、このメモリの一部を自分で解放する必要があります.例えば、次のような操作を行います.
myclass *p1 = new myclass();
myclass *p2 = new myclass();
myclass *p3 = new myclass();
std::set set_class;
set_class.insert(p1);
set_class.insert(p2);
set_class.insert(p3);
set_class.clear();
プログラムが上記のような手順のみであれば、p 1、p 2、p 3は実際には別の本格的な解放はなく、SVRで実行されるとメモリが漏れることになる.実際には次のようになります.
myclass *p1 = new myclass();
myclass *p2 = new myclass();
myclass *p3 = new myclass();
std::set set_class;
set_class.insert(p1);
set_class.insert(p2);
set_class.insert(p3);
for (std::set::iterator it = set_class.begin(); it != set_class.end(); it++)
delete *it;
set_class.clear();
erase操作についても同様です.要素を削除する前に、必要に応じてメモリを自分で解放します.
データの取得
1、std::setは下表オペレータを提供しない;
2、要素が存在するかどうかを判断するだけで、count関数を使って戻り値をチェックすることができます.
3、要素の値を取得する必要がある場合は、反復器を使用します.*iteratorは、反復器が指す値です.
std::set<:string> set_limit;
set_limit.insert(“User@123”);
set_limit.insert(“User@124”);
set_limit.insert(“User@125”);
//判断」User@124」がコレクションにあるかどうか
if (set_limit.count(“User@124”) == 1)
cout << “User@124コレクションに存在する"<else
cout << “User@124集合にいない"<//コレクション内のすべての要素値の出力
for (std::set<:string>::iterator it = set_limit.begin(); it != set_limit.end(); it++)
cout << *it << std::endl;
注意:set内の要素を指す反復器を取得すると、読み書き操作ではなく読み書き操作しかできません.
std::setタイプ定義
typedef Key key_type;
typedef Key value_type;
typedef typename rep_type::const_pointer pointer;
typedef typename rep_type::const_pointer const_pointer;
typedef typename rep_type::const_reference reference;
typedef typename rep_type::const_reference const_reference;
typedef typename rep_type::const_iterator iterator;
typedef typename rep_type::const_iterator const_iterator;
typedef typename rep_type::const_reverse_iterator reverse_iterator;
typedef typename rep_type::const_reverse_iterator const_reverse_iterator;
typedef typename rep_type::size_type size_type;
typedef typename rep_type::difference_type difference_type;
注:STLのソースコードを深く見るとsize_が表示されますtypeのタイプは実はsize_tは、実装によって異なる場合もある.
std::set使用例
std::setの宣言
std::set<:string> set_string;//要素タイプはstd::string、*反復器で得られる数値タイプはstd::string
std::set set_int;//要素タイプはint、*反復器で得られる数値タイプはint
適用シーン:アイテムの両替制限ユーザーごとに1回しか両替できず、両替したユーザーを保存します.
 
 
mapの基本的な使い方:挿入、検索、削除、遍歴など、デュアルキーmapを実現する方法を教えてくれます.
(1)2つのキーが一致している場合のみターゲットにヒットする(2)2つのキーのいずれかが一致している場合はターゲットにヒットする
マルチキーに拡張可能
( )   
  :
1.map Key object T Object     ,     Pair Associative Container,    value type  pair。
2.     Unique Associative Container,             Key。
3.     Sorted Associative Container,          less,greater   functor,      ,
  hash table  equal_to, not_equal_to   functor。
( )     
      ,    map       :   、  、  、  、         。
 
#if defined (_MSC_VER)
#pragma warning(disable: 4786)
#endif
#include 
#include 
#include 
int main(int argc, char *argv[])
{
  std::map _map;
  _map.insert( std::map::value_type(0, 32.8) );
  _map.insert( std::map::value_type(1, 33.2) );
  _map.insert( std::map::value_type(2, 35.8) );
  _map.insert( std::map::value_type(3, 36.4) );
  _map.insert( std::map::value_type(4, 37.8) );
  _map.insert( std::map::value_type(5, 35.8) );
  _map[7] = 245.3;
  std::map::iterator itr;
  itr = _map.find(4);
  if( itr != _map.end() )
  {
  std::cout  << "Item:"  << itr->first << " found, content: " << itr->second << std::endl;
  }
  std::cout  << std::endl;
  if( itr != _map.end() )
  {
  _map.erase(itr);
  }
  std::map::iterator itr1  =  _map.begin();
  for(  ;  itr1  !=  _map.end();)
  {
 //travel delete item from map
if(itr1->first == 2)
 {
  _map.erase(it++);
  continue;   }
 
 std::cout  << "Item:"  << itr1->first << ", content: " << itr1->second << std::endl;
  ++it;   }
  std::cout  << std::endl;
  _map.clear();
  return 0;
}