std::set 交叉并补

本文通过自定义结构体info并使用std::set存储,演示了如何在C++中实现两个set之间的交集操作。首先定义了一个包含字符串、整数及浮点数的结构体,并实现了比较运算符来支持std::set的排序需求。随后创建了两个set实例并填充数据,最后利用std::set_intersection获取这两个set的交集。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里只是简单的列出交的操作,具体参考std::set_xxxx相关函数,以及百度

typedef struct taginfo{
taginfo(const std::string _s, int _i, float _f):s(_s),ivalue(_i),fvalue(_f){}
bool operator < (const taginfo& s1)const
{
return this->s < s1.s;
}
std::string s;
int ivalue;
float fvalue;
}info;

//定义一个结构体,set中存放的单元,实际编码中也不会简单的int,std::string这里搞个自定义的结构体来测试

std::set<info> s;
s.insert(info("1", 10, 10.f));
s.insert(info("a", 10, 10.f));
s.insert(info("dddd", 10, 10.f));
s.insert(info("fwfw", 10, 10.f));
s.insert(info("3333", 10, 10.f));


std::set<info> s2;
s2.insert(info("a", 10, 10.f));
s2.insert(info("dddd", 10, 10.f));
s2.insert(info("fwfw", 10, 10.f));


std::set<info> s3;


std::set_intersection(s.begin(), s.end(), s2.begin(), s2.end(), std::inserter(s3, s3.begin()));

Visual Studio 2005, F5查看s3的结果吧。


std::vector<int> twoOpt(const std::vector<CDot>& points, const std::vector<CDot>& pointsEnd, std::vector<int> path) { CString str; bool improved = true; double bestDistance = 0; for (size_t i = 0; i < path.size() - 1; ++i) { bestDistance += calculateDistance(pointsEnd[path[i]], points[path[i + 1]]); } DWORD t1, t2,t3,t4; while (improved) { improved = false; for (size_t i = 0; i < path.size() - 1; ++i) { t3 = timeGetTime(); for (size_t k = i + 1; k < path.size(); ++k) { std::vector<int> newPath = path; twoOptSwap(newPath, i, k); double newDistance = 0; for (size_t j = 0; j < newPath.size() - 1; ++j) { newDistance += calculateDistance(pointsEnd[newPath[j]], points[newPath[j + 1]]); } if (newDistance < bestDistance) { path = newPath; bestDistance = newDistance; improved = true; break; // 提前终止内层循环 } } t4= timeGetTime() - t3; str.Format("i=%d,耗时:%d,bestDistance:%0.3f\n", i, t4, bestDistance ); OutputDebugString(str); } } return path; } void twoOptSwap(std::vector<int>& path, int i, int k) { if (i < k) { std::reverse(path.begin() + i, path.begin() + k + 1); } } double calculateDistance(const CDot& p1, const CDot& p2) { return std::sqrt(std::pow(p2.x - p1.x, 2) + std::pow(p2.y - p1.y, 2)); } std::vector<int> tspGreedy(const std::vector<CDot>& points,const std::vector<CDot>& pointsEnd,bool bSort,int nStartIndex) { int nStart=nStartIndex; std::vector<int> path; int nSize=points.size(); double dbMinDis=9999999999; std::vector<int> pathMin; for (int k=0;k<nSize;k++) { if (bSort) nStart=k; path.clear(); path.push_back(nStart); // 添加起始点 std::vector<bool> visited(points.size(), false); // 记录每个点是否已访问 visited[nStart] = true; // 起始点已访问 double dbDis=0; int currentIndex = nStart; // 当前所在点的索引 while (path.size() < points.size()) { // 未访问的点仍存在 double minDistance = 999999999;//std::numeric_limits<double>::max(); int nearestPoint = -1; for (int i = 0;
最新发布
03-19
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值