小编tin*_*lyx的帖子

什么是const引用比C++ 11中的pass-by-value更好?

我有一些pre-C++ 11代码,其中我使用const引用传递大量参数,如vector'很多.一个例子如下:

int hd(const vector<int>& a) {
   return a[0];
}
Run Code Online (Sandbox Code Playgroud)

我听说使用新的C++ 11功能,您可以vector按如下方式传递by值而不会出现性能命中.

int hd(vector<int> a) {
   return a[0];
}
Run Code Online (Sandbox Code Playgroud)

例如,这个答案

C++ 11的移动语义使得即使对于复杂对象,传递和返回值也更具吸引力.

上述两个选项在性能方面是否相同?

如果是这样,何时比选项2更好地使用const参考?(也就是为什么我们仍然需要在C++ 11中使用const引用).

我问的一个原因是const引用使模板参数的推导变得复杂,并且如果它与const引用性能相同,则仅使用pass-by-value会容易得多.

c++ c++11

57
推荐指数
4
解决办法
1万
查看次数

Haskell中Monad与Applicative的区别

我刚才读从以下typeclassopedia约之间的差异MonadApplicative.我能理解,没有joinApplicative.但是下面的描述看起来含糊不清,我无法弄清楚monadic计算/动作的"结果"究竟是什么意思.所以,如果我把一个值放入Maybe,这使得一个monad,这个"计算"的结果是什么?

让我们更仔细地看一下(>> =)的类型.基本的直觉是它将两个计算组合成一个更大的计算.第一个参数ma是第一个计算.但是,如果第二个论点只是一个mb,那将是无聊的; 那么计算就无法相互交互(实际上,这正是Applicative的情况).因此,(>> =)的第二个参数具有类型a - > mb:这种类型的函数,给定第一次计算的结果,可以产生第二个要运行的计算....直观地说,正是这种能力使用先前计算的输出来决定接下来运行哪些计算使Monad比Applicative更强大.应用计算的结构是固定的,而Monad计算的结构可以基于中间结果而改变.

是否有一个具体的例子说明"能够使用先前计算的输出来决定接下来要运行的计算",Applicative没有?

monads haskell applicative

50
推荐指数
5
解决办法
1万
查看次数

是否有必要在PHP中初始化/声明变量?

这个问题的目的是只为我和许多像我这样的人获取知识或信息.

所以我的问题是:

是否有必要在循环或函数之前初始化/声明变量?

问这个问题是我的困惑,因为我之前是否初始化/声明变量我的代码是否仍然有效.

我正在分享我实际意思的演示代码:

$cars = null;

foreach ($build as $brand) {
     $cars .= $brand . ",";
}

echo $cars;
Run Code Online (Sandbox Code Playgroud)

要么

foreach ($build as $brand) {
     $cars .= $brand . ",";
}

echo $cars;
Run Code Online (Sandbox Code Playgroud)

这两段代码对我来说都是一样的,所以在开始时初始化/声明一个变量是必要的吗?

php variables initialization declaration

28
推荐指数
2
解决办法
3万
查看次数

SQL查询的执行顺序

我对此查询的执行顺序感到困惑,请解释一下.我很困惑何时应用连接,调用函数,随Case添加新列以及添加序列号时.请解释所有这些的执行顺序.

select Row_number() OVER(ORDER BY (SELECT 1))  AS 'Serial Number', 
    EP.FirstName,Ep.LastName,[dbo].[GetBookingRoleName](ES.UserId,EP.BookingRole) as RoleName,  
    (select top 1 convert(varchar(10),eventDate,103)from [3rdi_EventDates] where EventId=13) as EventDate,
    (CASE [dbo].[GetBookingRoleName](ES.UserId,EP.BookingRole)  
            WHEN    '90 Day Client' THEN 'DC'
            WHEN    'Association Client'  THEN  'DC'
            WHEN    'Autism Whisperer'    THEN  'DC'
            WHEN    'CampII'             THEN   'AD' 
            WHEN    'Captain'              THEN 'AD' 
            WHEN    'Chiropractic Assistant' THEN 'AD'
            WHEN    'Coaches'               THEN 'AD'
            END) as Category from [3rdi_EventParticipants] as EP  
    inner join [3rdi_EventSignup] as ES on EP.SignUpId = ES.SignUpId  
    where EP.EventId = 13
    and userid in …
Run Code Online (Sandbox Code Playgroud)

sql-server

27
推荐指数
4
解决办法
6万
查看次数

std :: vector:无法将'std :: ostream {aka std :: basic_ostream <char>}'左值绑定到'std :: basic_ostream <char> &&'

尝试做一些简单的事情时,我遇到了一个令人困惑的错误消息

std::cout << std::vector<int>{1,2,3};
Run Code Online (Sandbox Code Playgroud)

这说

 cannot bind 'std::ostream {aka std::basic_ostream<char>}' lvalue to 'std::basic_ostream<char>&&'
 int main() {  std::cout << std::vector<int>{1,2,3}; }
Run Code Online (Sandbox Code Playgroud)

(使用gcc-4.8.1和-std = c ++ 11测试)

SO有类似的问题,如重载运算符<<:无法将左值绑定到'std :: basic_ostream <char> &&',这是关于某些带嵌套类的用户定义类.还有一个工作围绕这个问题的公认答案.

但我不知道这是否适用std::vector.有人可以解释为什么会发生这种错误std::vector,以及如何解释它?

谢谢

c++ gcc iostream stl c++11

21
推荐指数
2
解决办法
3万
查看次数

如何判断C++模板类型是否为C风格的字符串

我正在尝试编写一个模板is_c_str来测试一个类型是否是一个c风格的字符串.我需要这个尝试编写一个to_string函数,如我在这里的另一个问题所示: STL容器迭代器的模板特化?.

我需要分开c_str和其他类型的指针和迭代器,以便我可以在face值处表示第一个,并将指针/迭代器渲染为不透明的"itor"或"ptr".代码如下:

#include <iostream>
template<class T>
struct is_c_str
  : std::integral_constant<
  bool,
  !std::is_same<char *, typename std::remove_reference<typename std::remove_cv<T>::type>::type>::value
> {};

int main() {
  auto sz = "Hello";  //Or: const char * sz = "Hello";
  int i;
  double d;
  std::cout << is_c_str<decltype(sz)>::value << ", "
        << is_c_str<decltype(i)>::value << ", "
        << is_c_str<decltype(d)>::value << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

然而,is_c_str仅捕获没有const char *,还intdouble.以上代码输出:

1, 1, 1
Run Code Online (Sandbox Code Playgroud)

(截至gcc-4.8.1).

我的问题是如何修复is_c_str以正确捕获C风格的字符串?

c++ templates type-traits c++11

21
推荐指数
4
解决办法
2991
查看次数

我们在GCC 9中有C ++ 20范围库吗?

新发布的GCC 9是否支持C ++ 20范围库?

我从以下位置复制了范围库的示例代码:https : //en.cppreference.com/w/cpp/ranges

#include <vector>
#include <ranges>
#include <iostream>

int main()
{
  std::vector<int> ints{0,1,2,3,4,5};
  auto even = [](int i){ return 0 == i % 2; };
  auto square = [](int i) { return i * i; };

  for (int i : ints | std::view::filter(even) | std::view::transform(square)) {
    std::cout << i << ' ';
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,当使用g ++ 9.1(Ubuntu 18.04 LTS(Bionic Beaver))进行编译时,它抱怨<ranges>找不到:

$ g++ -std=c++2a cpp2a.cpp 
cpp2a.cpp:2:10: fatal error: ranges: No such file or …
Run Code Online (Sandbox Code Playgroud)

c++ gcc c++20

21
推荐指数
4
解决办法
2523
查看次数

Postgres字符串之前的"E"是什么?

我正在阅读像这样的Postgres/PostGIS语句:

SELECT ST_AsBinary(
ST_GeomFromWKB(
  E'\\001\\001\\000\\000\\000\\321\\256B\\312O\\304Q\\300\\347\\030\\220\\275\\336%E@',
  4326
  )
);
Run Code Online (Sandbox Code Playgroud)

上面从一个众所周知的二进制文件(WKB)创建了一些东西.我没有看到这里引用的具体方法,其中字符串是单引号,E前面是引号.

这种格式叫什么?这有什么格式规则?例如,336%E@在最后特殊或只是一些二进制值?

这是Postgres9.3/9.4; PostGIS 2.1.

postgresql postgis string-literals wkb

18
推荐指数
2
解决办法
8401
查看次数

对关系映射的功能是否比对象关系更容易?

已经很好地讨论了对象关系映射,包括在这里.我有一些方法的经验,陷阱和妥协.真正的分辨率似乎需要更改OO或关系模型本身.

如果使用功能语言,是否会出现同样的问题?在我看来,这两种范式应该比OO和RDBMS更好地融合在一起.在RDBMS中进行思考的想法似乎与功能方法似乎承诺的自动并行性相匹配.

有没有人有任何有趣的意见或见解?这个行业的状况如何?

database orm rdbms functional-programming

17
推荐指数
3
解决办法
4635
查看次数

为什么在c ++ 11中lambda函数没有函数<>类型?

我正在玩c ++ 11的功能.我发现奇怪的一件事是lambda函数的类型实际上不是函数<>类型.更重要的是,lambda似乎不能很好地使用类型推理机制.

附件是一个小例子,我在其中测试了翻转函数的两个参数以添加两个整数.(我使用的编译器是MinGW下的gcc 4.6.2.)在示例中,类型for addInt_f已使用函数<>显式定义,而addInt_l类型为类型推理的lambda auto.

当我编译的代码,该flip功能可以接受明确类型定义addInt的版本,但不是拉姆达版本,给了一个错误说, testCppBind.cpp:15:27: error: no matching function for call to 'flip(<lambda(int, int)>&)'

接下来的几行显示lambda版本(以及'raw'版本)如果显式转换为适当的函数<>类型,则可以接受.

所以我的问题是:

  1. 为什么lambda函数首先没有function<>类型?在小例子中,为什么不addInt_l具有function<int (int,int)>类型而不是具有不同的lambda类型?从函数式编程的角度来看,函数/函数对象和lambda之间有什么区别?

  2. 如果存在这两者必须不同的根本原因.我听说lambda可以转换为function<>但它们是不同的.这是C++ 11,一个执行问题是设计问题/缺陷还是有区分两者,因为它是方式的好处?似乎addInt_l单独的类型签名提供了关于函数的参数和返回类型的足够信息.

  3. 有没有办法编写lambda,以便可以避免上面提到的显式类型转换?

提前致谢.

    //-- testCppBind.cpp --
    #include <functional>
    using namespace std;
    using namespace std::placeholders;

    template <typename T1,typename T2, typename T3>
    function<T3 (T2, T1)> flip(function<T3 (T1, T2)> f) { return bind(f,_2,_1);}

    function<int (int,int)> addInt_f = [](int a,int b) -> int …
Run Code Online (Sandbox Code Playgroud)

c++ lambda functional-programming c++11

17
推荐指数
2
解决办法
4683
查看次数