多个vector,其中的元素是自定义结构,如何判断任意两个中含有相同元素?

alexmayer 2010-05-17 11:27:10
请教CSDN的朋友们:

有多个vector,其中的元素是自定义的结构,如何判断这多个vector中的任意两个vector含有相同元素?

比如

typedef _elem
{
int i;
int j;
int k;
}ELEM;

typedef vector<ELEM> MYVEC;

MYVEC v1;
MYVEC v2;
MYVEC v3;
MYVEC v4;
MYVEC v5;

这五个vector必须任何两个之间都没有相同的ELEM,该怎么判断?标准库里有相应的算法么?

打搅各位了,求指点。
...全文
542 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
jhony_lee 2010-05-17
  • 打赏
  • 举报
回复
用函数对象!
wade_2003 2010-05-17
  • 打赏
  • 举报
回复
学习,绑定
pengzhixi 2010-05-17
  • 打赏
  • 举报
回复
或者开一个map 里面存放map<ELEM,int> 但是你这里的elem要有严格的弱序运算和==比较运算。这样如果没有相同的元素的话那么map中的元素个数就是所有vector元素之和。

还可以将所有元素放到数组里面,然后用unique排序。
alexmayer 2010-05-17
  • 打赏
  • 举报
回复
有两个Vector,就要遍历一遍。

有5个就要遍历4遍。

N-1?能有更优的办法吗?
pengzhixi 2010-05-17
  • 打赏
  • 举报
回复
那么如果要一个个元素来查找的话,那么你要用一个for循环来使用这个。

比如
MYVEC v1;
MYVEC v2;
MYVEC::iterator it1=v1.begin();
MYVEC::iterator it2=v1.end();
MYVEC::iterator ittest;
for(MYVEC::iterator ite=v2.begin();ite!=v2.end();++ite)
if((ittest= search(it1,it2,ite,ite+1)!=it2)
cout<<"this is the same element in v1 and v2"<< *ittest<<endl;

pengzhixi 2010-05-17
  • 打赏
  • 举报
回复
不过这个是用来查找子串的。
pengzhixi 2010-05-17
  • 打赏
  • 举报
回复
template <class ForwardIterator1, class ForwardIterator2>
ForwardIterator1 search ( ForwardIterator1 first1, ForwardIterator1 last1,
ForwardIterator2 first2, ForwardIterator2 last2 );
某某9 2010-05-17
  • 打赏
  • 举报
回复
自己写函数吧!
tan870426 2010-05-17
  • 打赏
  • 举报
回复
自己重载个==
AlanBruce 2010-05-17
  • 打赏
  • 举报
回复
UP


UP

alexmayer 2010-05-17
  • 打赏
  • 举报
回复
取任何两个做比较当然好办。

问题是要求所有的vector比较,都不能有相同的元素,难道两两取出比较才行?
暗黑帝国 2010-05-17
  • 打赏
  • 举报
回复
恐怕没有这么智能的函数,不过你可以使用mismatch函数组合一下。
alexmayer 2010-05-17
  • 打赏
  • 举报
回复
Sorry,忘了加struct,抱歉!
yangyunzhao 2010-05-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lcl_data 的回复:]
引用 1 楼 yangyunzhao 的回复:
你自己定义的ELEM只能自己重载==或者!=符号了。

typedef _elem
{
int i;
int j;
int k;
}ELEM;
这种写法似乎少见,能编译?或者是我孤陋寡闻了

当然可以编译
[/Quote]

error C2470: “_elem” : 看起来像函数定义,但没有形参表;跳过明显的函数体
error C2501: “ELEM” : 缺少存储类或类型说明符

编译错误,是不是要做别的什么设置,还是?我用VS2003的
昵称很不好取 2010-05-17
  • 打赏
  • 举报
回复
find_if ,然后自己写函数对象比较
十八道胡同 2010-05-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 yangyunzhao 的回复:]
你自己定义的ELEM只能自己重载==或者!=符号了。

typedef _elem
{
int i;
int j;
int k;
}ELEM;
这种写法似乎少见,能编译?或者是我孤陋寡闻了
[/Quote]
当然可以编译
十八道胡同 2010-05-17
  • 打赏
  • 举报
回复
可以参考这个http://www.cplusplus.com/reference/stl/vector/
我觉得应该有的

当然你可以自己写重载的
yangyunzhao 2010-05-17
  • 打赏
  • 举报
回复
你自己定义的ELEM只能自己重载==或者!=符号了。

typedef _elem
{
int i;
int j;
int k;
}ELEM;
这种写法似乎少见,能编译?或者是我孤陋寡闻了
selooloo 2010-05-17
  • 打赏
  • 举报
回复
用unique


#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

bool same_elem(vector<int>& v1,vector<int>& v2)
{
vector<int> vt(v1.begin(),v1.end());
vector<int>::iterator itu;

copy(v2.begin(),v2.end(),back_inserter(vt));
sort(vt.begin(),vt.end());
itu=unique(vt.begin(),vt.end());
if(itu==vt.end())
return 0;
else
return 1;
}
int main(void)
{
vector<int> v1,v2;

v1.push_back(1);
v1.push_back(6);
v1.push_back(3);
v2.push_back(5);
v2.push_back(3);
if(same_elem(v1,v2))
cout<<"v1 v2 have same element"<<endl;
else
cout<<"v1 v2 don't have same element"<<endl;
system("pause");
return 0;
}
herman~~ 2010-05-17
  • 打赏
  • 举报
回复
感觉如果要快速比较容器里面的元素,应该使用map比较合理,定义一个key,或者重载< 操作符,把自定义结构做为key
加载更多回复(1)

64,685

社区成员

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

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