您的位置:首页 > 其它

STL中的set---可以直接修改set中的元素么?

2015-01-04 23:59 260 查看
      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的实现则有点瑕疵, 不过, 也不是什么大问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: