C ++ переменные шаблоны и аргументы шаблона шаблона: ошибка: несоответствие типа / значения в аргументе 1 в списке параметров шаблона

Если вы счастливы использовать пакет не base, data.table::inrange является удобной функцией.

x1[!inrange(x1, x2 - 0.045, x2 + 0.045)]
# [1] 1002.570  301.569

x2[!inrange(x2, x1 - 0.045, x1 + 0.045)]
# [1]   22.12   53.00 5666.31  100.10

inrange также эффективен для больших наборов данных. Напр. 1e5, inrange в > 700 раз быстрее, чем две другие альтернативы:

n <- 1e5
b1 <- runif(n, 0, 10000)
b2 <- b1 + runif(n, -1, 1)

microbenchmark(
  f1 = f(b1, b2, 0.045, 5000),
  f2 = list(in_b1_not_in_b2 = b1[sapply(b1, function(x) !any(abs(x - b2) <= 0.045))],
       in_b2_not_in_b1 = b2[sapply(b2, function(x) !any(abs(x - b1) <= 0.045))]),
  f3 = list(in_b1_not_in_b2 = b1[!inrange(b1, b2 - 0.045, b2 + 0.045)],
       in_b2_not_in_b1 = b2[!inrange(b2, b1 - 0.045, b1 + 0.045)]),
  unit = "relative", times = 10)
# Unit: relative
#  expr      min       lq     mean   median        uq       max neval
#    f1 1976.931 1481.324 1269.393 1103.567 1173.3017 1060.2435    10
#    f2 1347.114 1027.682  858.908  766.773  754.7606  700.0702    10
#    f3    1.000    1.000    1.000    1.000    1.0000    1.0000    10

И да, они дают тот же результат:

n <- 100
b1 <- runif(n, 0, 10000)
b2 <- b1 + runif(n, -1, 1)

all.equal(f(b1, b2, 0.045, 5000),
          list(in_b1_not_in_b2 = b1[sapply(b1, function(x) !any(abs(x - b2) <= 0.045))],
               in_b2_not_in_b1 = b2[sapply(b2, function(x) !any(abs(x - b1) <= 0.045))]))
# TRUE

all.equal(f(b1, b2, 0.045, 5000),
          list(in_b1_not_in_b2 = b1[!inrange(b1, b2 - 0.045, b2 + 0.045)],
               in_b2_not_in_b1 = b2[!inrange(b2, b1 - 0.045, b1 + 0.045)]))
# TRUE

Несколько связанных, потенциально полезных ответов, когда ищет inrange на SO .

3
задан llmc 19 January 2019 в 09:15
поделиться

1 ответ

Эти ошибки являются ошибками до C ++ 17. До C ++ 17 аргумент / параметр шаблона шаблона должен точно соответствовать.

Но так как добавление P0522R0 к стандарту, правило менее строгое, и этот код компилируется.

На сегодняшний день, я думаю, что только GCC реализует его, и вам нужно указать стандарт: gcc -std=c++17 см. Здесь .

0
ответ дан Oliv 19 January 2019 в 09:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: