学习STL set的时候遇到个奇怪的问题,不解,望大家帮个忙看看

cengshilieren 2011-06-29 02:56:10
我们知道STL中的set是有个默认的排序的且不能有相同的元素的,在插入元素的时候就自动进行排序,所以插完元素后的set是一个有序的集合,且为了保证这个有序,set是不允许对里面的元素进行修改的,否则就改变了set里面的顺序了,问题来了,我写了下面的代码后,set里面的值被改了,输出的时候竟然还有相同的元素,不解!上代码:

#include <iostream>
#include <vector>
#include <algorithm>
#include <deque>
#include <set>

using namespace std;

template <class T>
class SortBySelf
{
public:
bool operator () ( const T& a, const T& b)
{
return a > b;
}
};

void PrintInt( int& input)
{
if( input % 2 == 0)
{
input++;
}
}

void PrintSet( int& a )
{
cout<< a ;
}


int main(void)
{
set<int, SortBySelf<int>> s ;

for(int i = 0 ; i < 10; i++)
s.insert(i);

for_each( s.begin(), s.end(), PrintInt);

for_each(s.begin(), s.end(), PrintSet);

for( set<int, SortBySelf<int>>::iterator it = s.begin(); it != s.end(); it++ )
cout<< *it <<" ";

return 0 ;
}
...全文
147 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
elated 2011-07-01
  • 打赏
  • 举报
回复
《Effective STL》 第22条:切勿直接修改set或multiset中的键。这样做会破坏元素的有序性。
只是告诉你,不要这么做。并不是说set会在你这样做时依然确保正确。
RockyBoy 2011-07-01
  • 打赏
  • 举报
回复
编译根本不能通过, gcc in codeblocks
maoxing63570 2011-06-30
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 cengshilieren 的回复:]

我知道我用的是引用,但是set里面默认的是const_iterator 的迭代器,不应该能这样直接修改啊[/Quote]
set里面只有其底层的红黑树的const迭代器
cengshilieren 2011-06-30
  • 打赏
  • 举报
回复
能说详细点吗?有点不明白你说的[Quote=引用 10 楼 babilife 的回复:]
引用 7 楼 cengshilieren 的回复:
那你不觉得奇怪吗?set里面竟然有相同的元素引用 6 楼 q191201771 的回复:
set没怎么用过 不过刚去实验了一下

int main(void)
{
set<int> s;
s.insert(1);
s.insert(2);
s.insert(3);

set<int>::iterator iter = s.f……
[/Quote]
herman~~ 2011-06-30
  • 打赏
  • 举报
回复
set的begin()函数 返回的并不是一个常量迭代器。而lz用的print函数参数传引用
cengshilieren 2011-06-29
  • 打赏
  • 举报
回复
能举个例子吗?[Quote=引用 13 楼 chengzhe 的回复:]
算法学的不好? for_each是非质变算法, 质变算法使用transform
[/Quote]
chengzhe 2011-06-29
  • 打赏
  • 举报
回复
算法学的不好? for_each是非质变算法, 质变算法使用transform
cengshilieren 2011-06-29
  • 打赏
  • 举报
回复
我知道我用的是引用,但是set里面默认的是const_iterator 的迭代器,不应该能这样直接修改啊[Quote=引用 8 楼 lifesider 的回复:]
void PrintInt( int& input)
{
if( input % 2 == 0)
{
input++;
}
}

这个函数你使用的是引用,这样使用for_each( s.begin(), s.end(), PrintInt);的时候,对于set中的每一个iterator,你都会修改*iterator的值,即改变了set的中的值
[/Quote]
cengshilieren 2011-06-29
  • 打赏
  • 举报
回复
能说详细点吗?[Quote=引用 10 楼 babilife 的回复:]
引用 7 楼 cengshilieren 的回复:
那你不觉得奇怪吗?set里面竟然有相同的元素引用 6 楼 q191201771 的回复:
set没怎么用过 不过刚去实验了一下

int main(void)
{
set<int> s;
s.insert(1);
s.insert(2);
s.insert(3);

set<int>::iterator iter = s.f……
[/Quote]
至善者善之敌 2011-06-29
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 cengshilieren 的回复:]
那你不觉得奇怪吗?set里面竟然有相同的元素引用 6 楼 q191201771 的回复:
set没怎么用过 不过刚去实验了一下

int main(void)
{
set<int> s;
s.insert(1);
s.insert(2);
s.insert(3);

set<int>::iterator iter = s.find(3);
*iter = 1;

for ……
[/Quote]
没什么奇怪的,你都排好元素了,才去重,修改的
xbaiwgiz 2011-06-29
  • 打赏
  • 举报
回复
还没去学呢!先学MFC
lifesider 2011-06-29
  • 打赏
  • 举报
回复
void PrintInt( int& input)
{
if( input % 2 == 0)
{
input++;
}
}

这个函数你使用的是引用,这样使用for_each( s.begin(), s.end(), PrintInt);的时候,对于set中的每一个iterator,你都会修改*iterator的值,即改变了set的中的值
cengshilieren 2011-06-29
  • 打赏
  • 举报
回复
那你不觉得奇怪吗?set里面竟然有相同的元素[Quote=引用 6 楼 q191201771 的回复:]
set没怎么用过 不过刚去实验了一下

int main(void)
{
set<int> s;
s.insert(1);
s.insert(2);
s.insert(3);

set<int>::iterator iter = s.find(3);
*iter = 1;

for (iter = s.begin(); iter != s.end(); ++iter)
c……
[/Quote]
就想叫yoko 2011-06-29
  • 打赏
  • 举报
回复
set没怎么用过 不过刚去实验了一下

int main(void)
{
set<int> s;
s.insert(1);
s.insert(2);
s.insert(3);

set<int>::iterator iter = s.find(3);
*iter = 1;

for (iter = s.begin(); iter != s.end(); ++iter)
cout << *iter << '\t';

iter = s.find(1);
*iter = 2;

for (iter = s.begin(); iter != s.end(); ++iter)
cout << *iter << '\t';

return 0 ;
}
cengshilieren 2011-06-29
  • 打赏
  • 举报
回复
在PrintInt里改了啊,这也叫偷偷[Quote=引用 2 楼 qq120848369 的回复:]
C/C++ code

你偷偷摸摸的改,谁知道你改了.
[/Quote]
恨天低 2011-06-29
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 cengshilieren 的回复:]

我用的是模板类,所以要初始化一下什么类型引用 1 楼 icechenbing 的回复:
set<int, SortBySelf<int>> s ; ????
[/Quote]

明了!
cengshilieren 2011-06-29
  • 打赏
  • 举报
回复
我用的是模板类,所以要初始化一下什么类型[Quote=引用 1 楼 icechenbing 的回复:]
set<int, SortBySelf<int>> s ; ????
[/Quote]
qq120848369 2011-06-29
  • 打赏
  • 举报
回复
你偷偷摸摸的改,谁知道你改了.
恨天低 2011-06-29
  • 打赏
  • 举报
回复
set<int, SortBySelf<int>> s ; ????

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧