0210 在严酷漫长的寒冬中,我知道我身上有个不可战胜的夏日

Posted Marigolci

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了0210 在严酷漫长的寒冬中,我知道我身上有个不可战胜的夏日相关的知识,希望对你有一定的参考价值。

跬步不惧,日拱一卒

1.cmp在类内问题

cmp类内要加static ,类外不用

 2.堆的实现基本是用优先队列

大顶堆:priority_queue<int,vector<int>,less<int>> bigQ;

小顶堆:priority_queue<int,vector<int>,greater<int>> smallQ;

 

3.const_iterator(不可改变其指向的值,猜测可以防止误操作)&&const iterator(基本没用)&&iterator区别

iterator与const_iterator

所有的标准库容器都定义了相应的迭代器类型。迭代器对所有的容器都适用,现代 C++ 程序更倾向于使用迭代器而不是下标操作访问容器元素。

1.iterator,const_iterator作用:遍历容器内的元素,并访问这些元素的值。iterator可以改元素值,但const_iterator不可改。跟C的指针有点像
(容器均可以++iter,而vector还可以iter-n, iter+n,n为一整型,iter1-iter2:结果是difference_type类型,表两元素的距离.)

2.const_iterator 对象可以用于const vector 或非 const vector,它自身的值可以改(可以指向其他元素),但不能改写其指向的元素值.

3.const iterator与const_iterator是不一样的:声明一个 const iterator时,必须初始化它。一旦被初始化后,就不能改变它的值,它一旦被初始化后,只能用它来

改它指的元素,不能使它指向其他元素。(因此const iterator几乎没什么用途)

     vector<int> nums(10); // nums is nonconst
     const vector<int>::iterator cit = nums.begin();
     *cit = 1;               // ok: cit can change its underlying element
     ++cit;                  // error: can\'t change the value of cit

cend()是专门针对const_iterator指向终点的指针

 end()是普通的

 示例代码:

#include <iostream>
#include <set>

int main ()
{
  std::multiset<int> mymultiset = {10,20,30,20,10};

  std::cout << "mymultiset contains:";
  for (auto it=mymultiset.cbegin(); it != mymultiset.cend(); ++it)
    std::cout << \' \' << *it;

  std::cout << \'\\n\';

  return 0;
}

 

 multiset值得注意是 insert是会返回迭代器的,引用自以下这个网站

https://blog.csdn.net/qq_40889820/article/details/88592659

insert()(插入元素)
std::pair<iterator, bool> insert(const value_type& __x)
//插入元素__x,返回一个pair,pair的第一个元素为指向该元素的迭代器,若插入成功则pair的第二个元素为true,否则为false

std::pair<iterator, bool> insert(value_type&& __x)
//大致同上,其中&&为右值引用

iterator insert(const_iterator __position, const value_type& __x)
//从__position指向处开始插入元素__x,虽然最终结果都一样,但会影响插入的效率,返回值为该元素的迭代器

iterator insert(const_iterator __position, value_type&& __x)
//大致同上,其中&&为右值引用

template<typename _InputIterator>
    void insert(_InputIterator __first, _InputIterator __last)
//插入__first和__last间的元素

void insert(initializer_list<value_type> __l)
//initializer_list是C++11提供的新类型,用于表示某种特定类型的值的数组,和set一样,initializer_list也是一种模板类型

4.类型转化

int+double返回的值还是double

结果为double,原因是:要是为int的话,有可能会报错,因为double的值域比较大,也就是说,两个不同类型的数据运算,会转为值域较大的类型

 

5.LC295

295. Find Median from Data Stream
Hard

Median is the middle value in an ordered integer list. If the size of the list is even, there is no middle value. So the median is the mean of the two middle value.

For example,

[2,3,4], the median is 3

[2,3], the median is (2 + 3) / 2 = 2.5

Design a data structure that supports the following two operations:

  • void addNum(int num) - Add a integer number from the data stream to the data structure.
  • double findMedian() - Return the median of all elements so far.

 

Example:

addNum(1)
addNum(2)
findMedian() -> 1.5
addNum(3) 
findMedian() -> 2

 

Follow up:

  1. If all integer numbers from the stream are between 0 and 100, how would you optimize it?
  2. If 99% of all integer numbers from the stream are between 0 and 100, how would you optimize it?

方法一:

class MedianFinder{
public:
/*initialize your data structure here*/
    //给指针初始化为cend
    MedianFinder():l_(m_.cend()),r_(m_.cend()) {}
 
    //O(logn)
    void addNum(int num)
    {//aNb
        if(m_.empty())
        {
            //可以采用这种连续等号来不断赋值,因为从右往左所以可以赋值
            l_=r_=m_.insert(num);
            //void返回值直接用return结束
            return;
}
m_.insert(num);
const size_t n=m_.size();
 
//分情况讨论n的数据
//奇数情况 
if(n&1)
{
    //在指针前面加*代表该指针的数值
    if(num>=*r_)
    {
        l_=r_;
}
    else
    {
        //这个一句话完成两个变量的减法
    l_=--r_;
}
}
//偶数情况
else
{
    if(num>=*r_)
    {++r_;}
    else
    {--l_;}
    
}
 
 
}//aNe
 
double findMedian()
{
    //int+double结果还是double 短加长倾向长
    return (static_cast<double>(*l_)+ *r_) / 2;
    //return (static_cast<double>(*l_)+*r_)/2;
}
private:
//use balanced binary search tree
//data structure
multiset<int> m_;
//pointer
multiset<int>::const_iterator l_;
multiset<int>::const_iterator r_;
};//tte

方法二:

class MedianFinder
{
public:
/*initializa your data structure here*/
MedianFinder(){}
 
//l_.size()>=r_.size()因为答案奇数就在l_里找,若是奇数自然也是左比右多一个,但也只能多一个,要对数目进行管控,左比右多两个/右比左多一个都是要平衡的情况
void addNum(int num)
{
    //按照大小来决定存放的队列,依据队列的个数判断是否要平衡
    if(l_.empty()||num<=l_.top())
    {
        l_.push(num);
}
else
{
    r_.push(num);
}
if(l_.size()<r_.size())
{
        l_.push(r_.top());
    r_.pop();
}
else if(l_.size()-r_.size()==2)
{
    r_.push(l_.top());
    l_.pop();
}
}
 
double findMedian()
{
    if(l_.size()>r_.size())
        return static_cast<double>(l_.top());
    else
        return static_cast<double>(l_.top()+r_.top())/2;
}
private:
priority_queue<int,vector<int>,less<int>> l_;
priority_queue<int,vector<int>,greater<int>> r_;
};

 

以上是关于0210 在严酷漫长的寒冬中,我知道我身上有个不可战胜的夏日的主要内容,如果未能解决你的问题,请参考以下文章

2022 年,我身上发生的几件大事

2022 年,我身上发生的几件大事

“光荣在于平淡,艰巨在于漫长”

成长这事儿,不可不说-------Day36

羊毛出在猪身上?

2021.06.16即将到来的毕业