免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2152 | 回复: 11
打印 上一主题 下一主题

请教大家一个STL问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-12-10 23:18 |只看该作者 |倒序浏览
我在set容器里保存的数据stringSet和vector容器里保存的数据stringList是同一类数据,我想把这两个容器里的数据做交集滤除,就是把vector容器里与set容器里相同的数据去掉,不知道应该怎样写,请教大家,

论坛徽章:
0
2 [报告]
发表于 2005-12-10 23:45 |只看该作者
两者的*iterrator的类型是一致的,都是stringSet,你可以先对vector中的数据进行排序先,然后把vector和set进行比较,找到相同的元素就erase.

论坛徽章:
0
3 [报告]
发表于 2005-12-11 12:13 |只看该作者
可以在对vector进行排序后,首先用set_intersection获得交集,然后再分别用set_difference把两个容器中的交集元素去掉。

论坛徽章:
0
4 [报告]
发表于 2005-12-11 12:31 |只看该作者
重要的是我不想改变vector中元素的排列顺序,不知道还有什么办法没有,

论坛徽章:
0
5 [报告]
发表于 2005-12-11 13:28 |只看该作者
特殊要求的情况就自己写程序实现吧。

论坛徽章:
0
6 [报告]
发表于 2005-12-11 14:17 |只看该作者
复制vector内元素到set,然后调用set_intersection.

论坛徽章:
0
7 [报告]
发表于 2005-12-11 15:04 |只看该作者
这样写可以吗?
         vector<string>::iterator stringIter;//把vector容器的数据复制到set容器

      stringIter = stringList.begin();

      while (stringIter != stringList.end())

         {

         strcpy(buffer, (*stringIter).c_str());  

         stringSet1.insert(buffer);

          stringIter++ ;
        }
        set<string> result;//把set和set1两个容器里的数据进行交集滤除
set_difference(stringSet1.begin(), stringSet1.end(), stringSet.begin(), stringSet.end(), back_inserter(result));

论坛徽章:
0
8 [报告]
发表于 2005-12-11 15:11 |只看该作者
错了.应当有set_intersection
set_intersection是交
set_union是并
set_difference是差


  1. inline bool lt_nocase(char c1, char c2)
  2. {
  3.     return tolower(c1) < tolower(c2);
  4. }
  5. int main()
  6. {
  7.   int A1[] = {1, 3, 5, 7, 9, 11};
  8.   int A2[] = {1, 1, 2, 3, 5, 8, 13};  
  9.   char A3[] = {'a', 'b', 'b', 'B', 'B', 'f', 'h', 'H'};
  10.   char A4[] = {'A', 'B', 'B', 'C', 'D', 'F', 'F', 'H' };

  11.   const int N1 = sizeof(A1) / sizeof(int);
  12.   const int N2 = sizeof(A2) / sizeof(int);
  13.   const int N3 = sizeof(A3);
  14.   const int N4 = sizeof(A4);

  15.   cout << "Intersection of A1 and A2: ";
  16.   set_intersection(A1, A1 + N1, A2, A2 + N2,
  17.                    ostream_iterator<int>(cout, " "));    //获得两个集合的交集
  18.   cout << endl
  19.        << "Intersection of A3 and A4: ";
  20.   set_intersection(A3, A3 + N3, A4, A4 + N4,
  21.                    ostream_iterator<char>(cout, " "),
  22.                    lt_nocase);
  23.   cout << endl;
  24. }
复制代码

论坛徽章:
0
9 [报告]
发表于 2005-12-11 15:24 |只看该作者
老师我是想把Set1里与Set里相同的数据去掉,然后只要Set1里剩下的数据,不对吗?

论坛徽章:
0
10 [报告]
发表于 2005-12-11 15:34 |只看该作者
看错了,我以为你在求交集,如果是差的话,用set_difference就可以了.

不过

  1.   while (stringIter != stringList.end())

  2.          {

  3.          strcpy(buffer, (*stringIter).c_str());  

  4.          stringSet1.insert(buffer);

  5.           stringIter++ ;
  6.         }
复制代码

直接用copy(stringList.begin(), stringList.end(), stringSet1.begin());替换就行了,没有必要用while循环.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP