RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题

全部问题

Martin Hope
AccumPlus
Asked: 2020-07-08 16:31:04 +0000 UTC

使用默认参数的 Lambda 表达式类型推断

  • 10

在不使用 option-Wpedantic的情况下,启用 c++11 的编译器允许在 lambda 表达式中使用默认值。

对于这样的表达式,您可以使用std::function指定所有参数类型的类型,包括默认指定的参数。

但是,当使用带有 auto 关键字的自动类型推断时,lambda 表达式采用特定类型,例如main()::<lambda(int)>,其中括号中的值是传递给表达式的参数的类型。并且这些值总是被指定,不管它们是否有默认值(这通常是合乎逻辑的)。

下面是一个代码示例。

#include <functional>
#include <iostream>

void f1(std::function<int()> lambda)
{
    if (lambda)
    {
        std::cout << lambda() << std::endl;
    }
}

void f2(std::function<int(int)> lambda)
{
    if (lambda)
    {
        std::cout << lambda(1) << std::endl;
    }
}

int main()
{
    auto lambda1 = [](int a = 3) -> int
    {
        return a;
    };

    f1(lambda1);
    f2(lambda1);

    std::function<int()> lambda2 = []()
    {
        return 1;
    };

    std::function<int(int)> lambda3 = [](int a)
    {
        return a;
    };

    f1(lambda2);
    //f2(lambda2); // Очевидно несоответствие типов

    //f1(lambda3); // Очевидно несоответствие типов
    f2(lambda3);
}

在代码示例中,类型main()::<lambda(int)>被强制转换为std::function<int()>. 我没有足够的知识来理解为什么编译器不会对类型不匹配发誓。请帮我解释一下。

以及相关问题。

我可以明确指定一种类型,比如自动推断的类型吗?

我可以告诉编译器不允许这种类型的转换吗?

c++
  • 3 个回答
  • 10 Views
Martin Hope
ghostinecatnewyear
Asked: 2020-06-11 19:25:48 +0000 UTC

为什么链接时头文件中定义的内联函数不重复?

  • 10

我阅读了有关“常规”和内联函数的事实:

在前面的章节中,我们反复说过,你不应该在头文件中定义函数,因为如果你在几个 .cpp 文件中包含一个带有函数定义的头文件,那么函数定义也会被复制多次。然后,当您链接文件时,链接器将抛出一个错误,表明您多次定义相同的函数。

但是,内置函数不受此规则的约束,因为源代码中没有重复 - 函数的定义是一个,并且在通过链接器连接 .cpp 文件时不应有任何冲突。

为什么不能在头中定义函数很清楚:链接包含该头的多个模块时会发生“多重定义”。但是从文本中根本不清楚为什么该规则不适用于内联函数。我是这样理解的:“内联函数不重复,因为它们不重复。” 狂欢。

当然,我可以理所当然地考虑这个事实,仅此而已,但是我仍然想了解为什么会发生这种情况,但是本文没有给出详尽的解释。

c++
  • 2 个回答
  • 10 Views
Martin Hope
Dmitry Chebakov
Asked: 2020-06-04 07:20:41 +0000 UTC

用线段覆盖一组点的问题(或背包问题)

  • 10

前端开发者的Yandex.Blitz竞赛最近结束了,我想分析一个问题。(我再次重申,比赛已经结束)。在我看来,这个问题介于背包问题和用线段覆盖一组点之间。这是它的完整措辞:

有一个 devops Petya。在工作中,他需要在接下来的 100 天内在某些日子值班。彼佳乘地铁上班。订阅票被引入地铁,从第一次乘坐之日起的一定天数内有效。门票的持续时间越长,每天的费用就越低。我们需要帮助 Petya 省钱,并在考虑到他的值班时间的情况下,提前三个月计算出他需要购买哪些票,以使他们的总成本尽可能低。彼佳也不喜欢随身携带很多票,如果有几种最低成本相同的票,那么彼佳需要一张票少的。如果有多个这样的选项(最低成本和门票数量相同),那么其中任何一个都适合 Petya。getCheapestTickets(days, tickets),它将 Petya 的值班表 ( days) 和可能的订阅票选项 ( tickets) 作为输入,并作为输出给出 Petya 需要购买的票列表(以票选项输入数组中的索引的形式)。Petya 的值班时间表以排序后的数字数组形式给出(从 1 到 100 包括在内),每个数字表示值班日的序号:

// Петя должен дежурить на второй, пятый, десятый и сорок пятый день относительно текущей даты  
[2, 5, 10, 45]

每个订阅票由以下接口描述:

interface Ticket {  
    // количество дней, в течение которых билет действует со дня первой поездки по нему,  
    // включая этот день (от 1 до 100 включительно)  
    duration: number;  
    // стоимость билета (от 1 до 100 включительно)  
    cost: number;  
}

门票选择数量不超过10个,并保证所有门票价格不同,门票有效期越多,一日成本越低。

输入格式

days:
[1, 2, 4, 6, 7, 8, 9, 10, 20]
tickets:

[  
    { cost: 3, duration: 1 },  
    { cost: 10, duration: 7 },  
    { cost: 20, duration: 30 }  
]

输出格式

[0, 0, 1, 0]

我的问题是我的解决方案没有及时通过。首先,我尝试通过递归遍历整个决策树(JavaScript)来解决这个问题:

const getCheapestTickets = (days, tickets) => {
  // Вспомогательная функция для обхода всех вариантов билетов.
  // l указывает на текущий день из массива days.
  const wrapper = (l) => {
    let min = null;

    // Обходим все билеты.
    for (let i = 0; i < tickets.length; i += 1) {
      const ticket = tickets[i];
      let j = l;

      // Считаем количество дней, которые покрывает данный билет.
      const skip = days[l] + ticket.duration;
      while (skip > days[j]) {
        j += 1;
      }

      let curr;
      if (j < days.length) {
        // Рекурсивно ищем решение для оставшихся дней.
        curr = wrapper(j);
        curr.sum += ticket.cost;
      } else {
        curr = { sum: ticket.cost, includes: [] };
      }

      const currIncludes = [i, ...curr.includes];
      curr = { ...curr, includes: currIncludes };

      if (min === null) {
        min = curr;
      } else if (
        (curr.sum === min.sum && curr.includes.length < min.includes.length)
        || curr.sum < min.sum) {
        min = curr;
      }
    }

    return min;
  };

  return wrapper(0, 0).includes;
};

在这里,我不明白如何丢弃决策分支。我看不出如何将其简化为经典的背包问题,通过矩阵寻求解决方案。接下来,我尝试编写相同的解决方案,但没有递归,也绕过所有可能的变化,但在树的帮助下。也没有及时过去。请帮助制定更优化的算法。解决方案是单线程的,这一点很重要。

алгоритм
  • 2 个回答
  • 10 Views
Martin Hope
user301823
Asked: 2020-06-03 01:24:24 +0000 UTC

预处理器留下的评论

  • 10

预处理源文件后。例如,这样的

int main()
{
    return 0;
}

事实证明

# 1 "main.cpp"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "main.cpp"

int main()
{
    return 0;
}

那么,,,,# 1 "main.cpp"是# 1 "<built-in>"什么# 1 "<command-line>"意思# 1 "main.cpp"?我阅读了有关预处理器的信息,但没有找到任何关于它的信息。

PS:底线是我想写自己的C++编译器,自然要从预处理器入手,因为这本身就是最简单的部分。超出任务的东西是不值得的,只是为了娱乐。当然,我想立即检查预处理器。在我写完所有内容之前。因此,关于预处理器的奇怪问题。好吧,当然,我不打算实现编译器中的所有内容。只有最低限度。

c++
  • 1 个回答
  • 10 Views
Martin Hope
The Prototype
Asked: 2020-04-10 05:08:40 +0000 UTC

String 和 UUID 哪个更快?

  • 10

我想一劳永逸地找出在哈希集合中用作键的更好和更方便的方法String还是UUID?

Map<String, Value> map = ...
Map<UUID, Value> map = ...
java
  • 1 个回答
  • 10 Views
上一页
下一页

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5