目錄
1, 什么是set
2, 創建set
2-1, 標準數據類型
2-2, 自定義數據類型
2-3, 其他創建方式
3, 操作set
3-1, 賦值
3-2, 添加元素(insert)
?3-2-1, 添加元素(insert)
3-2-2-1, 標準數據類型
3-2-2-2, 自定義數據類型
3-3, 查詢
3-4, 查找(find)
3-4-1, 標準數據類型
3-4-2, 自定義數據類型
3-5, 獲取長度(size)
3-6, 統計元素數量(count)
3-7, 交換(swap)
3-7, 刪除元素(erase)
3-8, 清空元素(clear)
3-9, 判斷是否為空(empty)
4, multiset
1, 什么是set
C++中的一種容器數據類型, 也叫集合容器, 會對插入的數據進行自動排序
分為set和multiset, 前者不允許重復值, 后置允許
2, 創建set
通過set<數據類型> 對象名, 創建set, 數據類型可以是標準數據類型, 也可以是自定義類型
2-1, 標準數據類型
//指定容器中元素數據類型為string
set<string> s1;
2-2, 自定義數據類型
class Myclass
{
public:Myclass() {};Myclass(string name, int age) :m_name(name), m_age(age) {};string m_name;int m_age;
};Myclass m("aaa", 1);
//容器中元素的類型為Myclass
set<Myclass> s1;
2-3, 其他創建方式
Myclass m1("aaa", 1);
set<Myclass> s1;
//拷貝構造方式創建
set<Myclass> s2(s1);
//通過迭代器指定區間方式創建
set<Myclass> s3(s2.begin(), s2.end());
3, 操作set
3-1, 賦值
通過set<數據類型> 對象名2 = 對象名1, 進行賦值
set<Myclass> s1;
set<Myclass> s2 = s1;
3-2, 添加元素(insert)
?3-2-1, 添加元素(insert)
通過對象名.insert(值), 可向set中插入元素
3-2-2-1, 標準數據類型
set<string> s1;
//向set容器中插入字符串對象aaa
s1.insert("aaa");
3-2-2-2, 自定義數據類型
//仿函數,定義排序規則
class MyCompare
{
public:bool operator()(const Myclass m1, Myclass m2) const{return m1.m_name > m2.m_name;}
};Myclass m1("aaa", 1);
//插入自定義類型時,需要指定仿函數
set<Myclass, MyCompare> s1;
//向set容器中插入m1
s1.insert(m1);
//通過迭代器指定位置插入
s1.insert(s1.begin(), m2);
3-3, 查詢
通過for循環, 可遍歷set中的元素
class Myclass
{
public:Myclass() {};Myclass(string name, int age) :m_name(name), m_age(age) {};string m_name;int m_age;
};class MyCompare
{
public:bool operator()(const Myclass m1, Myclass m2) const{return m1.m_name > m2.m_name;}
};int main()
{Myclass m1("aaa", 1);Myclass m2("bbb", 1);set<Myclass, MyCompare> s1;s1.insert(m1);s1.insert(m2);for (set<Myclass>::iterator it = s1.begin(); it != s1.end(); it++){cout << "姓名:" << it->m_name << " 年齡:" << it->m_age << endl;}system("pause");return 0;
}
3-4, 查找(find)
通過對象名.find(元素), 獲取s1中的元素,?找到返回對應的迭代器,未找到返回s1.end()
3-4-1, 標準數據類型
set<string> s1;
s1.insert("aaa");
//通過s1.find(m1)查找s1中的m1元素, 找到返回對應的迭代器,未找到返回s1.end()
set<string>::iterator ret = s1.find("aaa1");if (ret != s1.end())
{cout << "存在" << endl;
}
else
{cout << "不存在" << endl;
}
3-4-2, 自定義數據類型
//通過s1.find(m1)查找s1中的m1元素, 找到返回對應的迭代器,未找到返回s1.end()
set<Myclass, MyCompare>::iterator ret = s1.find(m1);if (ret != s1.end())
{cout << "存在m1" << endl;
}
else
{cout << "不存在m1" << endl;
}
3-5, 獲取長度(size)
通過對象名.size(), 獲取set的元素個數
cout << s1.size() << endl;
3-6, 統計元素數量(count)
通過對象名.count(對象), 獲取set的元素個數
cout << s1.count(m1) << endl;
3-7, 交換(swap)
通過對象名1.swap(對象名2), 交換兩個set的元素, 兩個set的數據類型需要一致
s1.swap(s2);
3-7, 刪除元素(erase)
通過對象名.erase(迭代器位置), 刪除元素
//指定迭代器位置刪除元素
set<Myclass, MyCompare>::iterator it = s1.begin();
it++;
it++;
s1.erase(it);
3-8, 清空元素(clear)
通過對象名.clear(), 清空set元素
s1.clear();
//指定迭代器區間清空元素
s1.erase(s1.begin(), s1.end());
3-9, 判斷是否為空(empty)
通過對象名.empty(), 判讀set容器中元素是否為空, 為空返回1, 不為空返回0
cout << s1.empty() << endl;
4, multiset
multiset可插入重復的元素
int main()
{multiset<string> s1;s1.insert("m1");s1.insert("m1");s1.insert("m1");for (multiset<string>::iterator it = s1.begin(); it != s1.end(); it++){cout << *it << endl;}system("pause");return 0;
}