STL中set的find函数是什么原理啊采用的什么算法啊该如何处理

STL中set的find函数是什么原理啊?采用的什么算法啊?
最近用到在set中插入结构体的用法。并且重载了比较运算符,但是还是出现一个问题。就是即使在set中已经存在一个结构体,但是使用find仍然找不到,但是有的能找到。我想应该是我重载的比较运算符有问题,但是又不知道该怎么改,请各位高手帮帮我,谢谢啊!
以下是源代码:
#pragma warning (disable: 4786)
#include <iostream>
#include <windows.h>
#include <set>
using namespace std;

struct Edge
{
BYTE startX;
BYTE startY;
BYTE endX;
BYTE endY;

Edge()
{
startX=startY=endX=endY=0;
}
Edge(const Edge& e)
{
this->startX=e.startX;
this->startY=e.startY;
this->endX=e.endX;
this->endY=e.endY;
}

bool operator ==(const Edge& e)
{
return (this->startX==e.startX &&
this->startY==e.startY &&
this->endX==e.endX &&
this->endY==e.endY);
}

Edge& operator =(const Edge& e)
{
this->startX=e.startX;
this->startY=e.startY;
this->endX=e.endX;
this->endY=e.endY;
return *this;
}

  //感觉问题很可能出在这里
bool operator < (const Edge& e) const
{
return (this->startX < e.startX || this->startY < e.startY ||
this->endX<e.endX || this->endY<e.endY);
}

};

void main()
{
set<Edge> edgeSet;

//为了测试添加了5个元素
Edge e1;
e1.startX=0;
e1.startY=0;
e1.endX=1;
e1.endY=0;
Edge e2;
e2.startX=0;
e2.startY=1;
e2.endX=e2.endY=1;
Edge e3;
e3.startX=e3.startY=0;
e3.endX=0;
e3.endY=1;
Edge e4;
e4.startX=1;
e4.startY=0;
e4.endX=e4.endY=1;
Edge e5;
e5.startX=1;
e5.startY=0;
e5.endX=2;
e5.endY=0;

edgeSet.insert(e1);
edgeSet.insert(e2);
edgeSet.insert(e3);
edgeSet.insert(e4);
edgeSet.insert(e5);

for (set<Edge>::iterator it=edgeSet.begin();it!=edgeSet.end();it++)
{
int sx=(*it).startX;
int sy=(*it).startY;
int ex=(*it).endX;
int ey=(*it).endY;
cout<<sx<<","<<sy<<" "<<ex<<","<<ey<<endl;
}
cout<<"==================================="<<endl;

set<Edge>::iterator iter=edgeSet.find(e5);//找不到e5,大家可以试一下其他元素

int sx=(*iter).startX;
int sy=(*iter).startY;
int ex=(*iter).endX;
int ey=(*iter).endY;
cout<<sx<<","<<sy<<" "<<ex<<","<<ey<<endl;
}


------解决方案--------------------
探讨

重载的< 有问题。
会出现a<b为真 a<b也为真的情况

------解决方案--------------------
去看《effective stl》,关于“等于不是等于”的item,和关于“严格弱序”的item
------解决方案--------------------
很明显operator<重载导致在比较的时候出现了歧义了。