std::set<std::pair<>>的去重,多个点能创建几条直线

本文探讨了如何利用两点创建直线,并通过多个点生成所有可能的直线。使用C++ STL中的set和multimap进行直线去重及排序操作。此外,还介绍了在整数除法中确保结果精度的方法。

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

两点能创建一条直线,多个点能创建几条直线

#include<iostream>
#include<map>
#include<set>

struct point {
    int x, y;
    point(int a, int b)
    {
        x = a;
        y = b;
    }
    point() { x = 0; y = 0; }
};
void test_point2line(int xrange, int yrange)
{
    // 存储点
    std::vector<point> p;
    for (int i = 0; i < xrange; i++)
    {
        for (int j = 0; j < yrange; j++)
        {
            p.push_back({ i,j });
        }
    }

    // 直线存储
    std::set<std::pair<double, double>> lines;

    // 每2个点创建直线
    for (int i = 0; i < p.size(); ++i)
    {
        for (int j = 0; j < p.size(); ++j)
        {
            if (p[i].x != p[j].x && p[i].y != p[j].y)
            {
                // k = (y2-y1)/(x2-x1)
                double k = (double)(p[j].y - p[i].y) / (p[j].x - p[i].x);
                // b = y - kx = y - x(y2-y1)/(x2-x1)
                double b = (p[j].y * (p[j].x - p[i].x) - (p[j].y - p[i].y) * p[j].x) * 1.0 / (p[j].x - p[i].x);
                // y=kx+b:斜率k和常熟b就表示一条直线
                lines.insert(std::pair(k, b));
            }
        }
    }
    // 加上 (y = b), kx = 0 , 这些线(k=0,k=1)时的情况 
    std::cout << lines.size() + xrange + yrange << std::endl;
}

在这里插入图片描述


set支持std::pair<>类型的对象的去重

std::set<std::pair<double,double>>

// 检查直线是否重复
int removeRepeated(std::multimap<double, double>& lines)
{
    std::set<std::pair<double, double>> newSet;
    //std::multimap<double, double> newMap;
    for (auto it:lines)
    {
        // 使用set去重,没想到能支持piar<key,value>的对象,key和value都能去重
        newSet.insert(std::make_pair(it.first,it.second));
        //newMap.insert(std::make_pair(it.first,it.second));
    }

    return newSet.size();
}

结果:
在这里插入图片描述


std::multimap按value排序

例如: std::multimap<double,double>排序

// multimap按value值排序,但是很耗空间
void SortMap(std::multimap<double, double>& lines)
{
    std::multimap<double, double> newMap;
    for (auto it : lines)
    {
        // key和value反着插入到新map中,得出根据value排序的结果
        newMap.insert(std::make_pair(it.second, it.first));
    }
    std::multimap<double, double>().swap(lines);//清空
    for (auto it2:newMap)
    {
        // key和value插回
        lines.insert(std::make_pair(it2.second,it2.first));
    }
}

int/int时*1.0 或 (double)int/int 来保证结果正确

 double k = (double)(6 - 2) / (4 - 1);
 double k1 = 1.0 * (6 - 2) / (4 - 1);
 double k2 = (6 - 2) / (4 - 1);

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路途遥远gg

帮到你了就好

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值