原创

C++ 学习笔记

1. 函数重载

不能仅仅通过返回类型不同来重载函数。

返回类型不同的重载函数报错

2. 函数指针

什么是回调函数?

当程序跑起来时,一般情况下,应用程序(application program)会时常通过API调用库里所预先备好的函数。但是有些库函数(library function)却要求应用先传给它一个函数,好在合适的时候调用,以完成目标任务。这个被传入的、后又被调用的函数就称为回调函数(callback function)。 作者:no.body 链接:https://www.zhihu.com/question/19801131/answer/27459821 来源:知乎

回调函数
//回调函数
int DoubleF(int a)
{
	return a * 2;
}

int FourF(int a)
{
	return a * 4;
}

int GetNumber(int k,int (*func)(int))
{
	return (func(k));
}

int main()
{
	int result1 = GetNumber(1,DoubleF);
	int result2 = GetNumber(2, DoubleF);
	std::cout << result1 << std::endl;
	std::cout << result2 << std::endl;
}

输出结果:

输出结果

指针函数

指针函数,简单的来说,就是一个返回指针的函数,其本质是一个函数,而该函数的返回值是一个指针。 声明格式为:*类型标识符 函数名(参数表)

int * func_sum(int n)

3. 构造函数

使用初始化列表的好处?

1. 类成员中存在非静态常量或者引用类型,只能使用列表初始化

2. 成员变量没有默认初始化函数时,比如自定义的类,同样只能使用列表初始化。

3. 提高效率。

  • 为什么成员初始化列表效率更高?

因为对于非内置类型,少了一次调用默认构造函数的过程。

  • 初始化列表是成员变量定义的地方,而类里面只是对变量的声明。初始化列表早于为其开辟内存空间。

默认构造函数的作用

  • 为什么建议要自定义默认构造函数?

静态成员的初始化问题

4. 顺序容器

array和数组的区别?

array与数组最大的区别是array是一种容器类型,它支持一系列容器操作,但是它和数组更接近,很多通用的容器操作它却不支持,因此在这里和数组来比较。

下面从容器的角度来看array和其他容器的区别。

1. 不支持局部拷贝

例如不允许C c(b, e);//将迭代器b和e之间的元素拷贝到c。不允许用C1={a,b,c...};用列表中的元素替换C1

2.不允许添加或删除元素,因为array是固定大小的。

相比于数组,array可以使用成员函数。其中包括:

1.可以使用拷贝和赋值,只要保证类型一致即可

2.使用swap函数,a.swap(b);或者swap(a,b);交换两者的元素

3.使用正向和反向迭代器

array是数组的升级版,将数组正式纳入到容器的范畴。array在使用和性能上都要强于内置数组,对于一些固定大小的使用场景,可以用array来替代原先数组的工作。

reserve()和resize(), 哪个会初始化vector?

从两个函数的用途可以发现,容器调用resize()函数后,所有的空间都已经初始化了,所以可以直接访问。

而reserve()函数预分配出的空间没有被初始化,所以不可访问。

写一个自己的string?

https://www.cnblogs.com/chengxuyuancc/p/3233124.html

1. 头文件

class String
{
public:
    String();
    String(const char *);
    String(const String &);
    String(String &&); //新加的move构造函数

    ~String();

    String& operator=(const char *);
    String& operator=(const String &);

    bool operator==(const char *);
    bool operator==(const String &);

    char &operator[](int);

    String operator+(const char *);
    String operator+(const char);
    String operator+(const String &);

    String &operator +=(const char *);
    String &operator +=(const char);
    String &operator +=(const String &);

    int size(){return _size;}
    char *c_str(){return _string;}

    friend istream &operator>>(istream &cin, String &str);
private:
    int _size;
    char *_string;
};

2. 源文件

String::String(const char *str)
{
    if (!str)
    {
        _size = 0;
        _string = NULL;
    }
    else
    {
        _size = strlen(str);
        _string = new char[_size + 1];
        strcpy(_string, str);
        _string[_size] = 0;
    }
}

String::~String()
{
    if (_string)
        delete _string;

    cout << "~String() call" << endl;
}

String::String(const String &str)
{
    if (!str._size)
    {
        _size = 0;
        _string = NULL;
    }
    else
    {
        _size = str._size;
        _string = new char[_size + 1];
        strcpy(_string, str._string);
        _string[_size] = 0;
    }

}

String String::operator+(const String &str)
{
    assert(_string && str._string);

    String str_temp(*this);

    str_temp += str;
    return std::move(str_temp);
}

String::String(String && str)
{
    _size = str._size;
    _string = str._string;
    str._string = NULL;
}

istream &operator>>(istream &cin, String &str)
{
    const int limit_string_size = 4096;
    
    str._string = new char[limit_string_size];

    cin >> setw(limit_string_size) >> str._string;
    str._size = strlen(str._string);
    return cin;
}

ostream &operator<<(ostream &cout, String &str)
{
    return cout << str.c_str();
}

如何用队列实现栈?

1.栈实现队列:思路是有两个栈,一个用来放数据(数据栈),一个用来辅助(辅助栈)。数据添加时,会依次压人栈,取数据时肯定会取栈顶元素,但我们想模拟队列的先进先出,所以就得取栈底元素,那么辅助栈就派上用场了,把数据栈的元素依次弹出到辅助栈,但保留最后一个元素,最后数据栈就剩下了最后一个元素,直接把元素返回,这时数据栈已经没有了数据。最后呢,把辅助栈的元素依次压人数据栈,这样,我们成功取到了栈底元素。

2.队列实现栈

思路同上:有数据队列和辅助队列,模拟栈的先进后出,队列是队尾进队头出,也就是说每次取值要取队列的队尾元素,数据队列出队到辅助队列,留下最后一个元素返回,辅助队列再把元素出队到数据队列

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 深度学习-Faster RCNN论文笔记

    在本文中,我们展示了算法的变化——用深度卷积神经网络计算区域提议——导致了一个优雅和有效的解决方案,其中在给定检测网络计算的情况下区域提议计算接近领成本。为此,...

    肉松
  • 深度学习Pytorch检测实战 - Notes - 第6章 单阶经典检测器:YOLO

    相比起Faster RCNN的两阶结构,2015年诞生的YOLO v1创造性地使用一阶结构完成了物体检测任务,直接预测物体的类别与位置,没有RPN网络,也没有类...

    肉松
  • Pytorch 分布式训练

    即进程组。默认情况下,只有一个组,一个 job 即为一个组,也即一个 world。

    肉松
  • *(int*)&p

    分析: void(p)(); 这行代码定义了一个指针变量p,p指向一个函数。这个函数的参数和返回值都为void。 &p是求指针变量p本身的地址。 ...

    Daotin
  • BZOJ2002: [Hnoi2010]Bounce 弹飞绵羊(LCT)

    attack
  • POJ 刷题系列:1789. Truck History

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.n...

    用户1147447
  • 你听过算法也是可以贪心的吗?

    贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。 贪心算法...

    用户1332428
  • codeforces 580C(dfs)

    给一棵n个节点树,某个结点可能会打上标记,从根节点走,问有几条路径上的连续标记树不超过m。

    dejavu1zz
  • 程序员面试金典 - 面试题 10.10. 数字流的秩(map/树状数组)

    假设你正在读取一串整数。每隔一段时间,你希望能找出数字 x 的秩(小于或等于 x 的值的个数)。

    Michael阿明
  • 贪心算法总结贪心算法基本思路算法实现实例分析参考

    贪心算法 贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。...

    致Great

扫码关注云+社区

领取腾讯云代金券