set就是互斥集合, 直接吃菜:
#pragma warning(disable: 4786)
#include<set>
#include <iostream>
using namespace std;
int main()
{
set<int> st;
set<int>::iterator it;
if (st.empty())
{
cout << "empty" << endl; // 开始为空
}
it = st.find(2);
if (it != st.end())
{
cout << "yes" << endl;
}
else
{
cout << "no" << endl; // 找不到2
}
// 插入数据。
st.insert(3);
st.insert(1);
st.insert(4);
st.insert(2);
st.insert(2); // 重复, 不会插入
st.insert(2); // 重复, 不会插入
// 迭代器遍历
for (it = st.begin(); it != st.end(); it++)
{
cout << *it << endl; // 1 2 3 4, 说明set互异, 且是有序的set
}
it = st.find(2);
if (it != st.end())
{
cout << "yes" << endl; // 有了
}
else
{
cout << "no" << endl;
}
int result = st.erase(2);
cout << result << endl; // 1
st.clear();
return 0;
}
我们再来看看这样一个问题: set中的元素是否可以直接修改?
#pragma warning(disable: 4786)
#include<set>
#include <iostream>
using namespace std;
int main()
{
set<int> st;
set<int>::iterator it;
// 插入数据。
st.insert(3);
st.insert(1);
st.insert(4);
st.insert(2);
st.insert(2); // 重复, 不会插入
st.insert(2); // 重复, 不会插入
it = st.begin();
*it = 100; // 居然可以啊, C++ primer说不可以修改啊。极有可能VC++6.0的实现有点瑕疵, 不过也不是啥大问题!
return 0;
}
而且, 我验证了一下, 在VS2005中, 也是如此, 居然通过。 但是, 在gcc中, 上面的程序会报错。
我们知道, set的迭代器有iterator和const_iterator, 但是, 对于set这个特殊的关联容器, 这两者都是一样的, 也就是说: set中的元素只可以读, 不可以写。 gcc是按照标准实现了的, 而微软的VC++6.0和VS2005的实现则有点瑕疵, 不过, 也不是什么大问题。
后记: 三年多后, 同事碰到了这个问题(编译问题), 我路过, 了解了一下, 5分钟搞定。