我有一些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会容易得多.
我刚才读从以下typeclassopedia约之间的差异Monad和Applicative.我能理解,没有join在Applicative.但是下面的描述看起来含糊不清,我无法弄清楚monadic计算/动作的"结果"究竟是什么意思.所以,如果我把一个值放入Maybe,这使得一个monad,这个"计算"的结果是什么?
让我们更仔细地看一下(>> =)的类型.基本的直觉是它将两个计算组合成一个更大的计算.第一个参数ma是第一个计算.但是,如果第二个论点只是一个mb,那将是无聊的; 那么计算就无法相互交互(实际上,这正是Applicative的情况).因此,(>> =)的第二个参数具有类型a - > mb:这种类型的函数,给定第一次计算的结果,可以产生第二个要运行的计算....直观地说,正是这种能力使用先前计算的输出来决定接下来运行哪些计算使Monad比Applicative更强大.应用计算的结构是固定的,而Monad计算的结构可以基于中间结果而改变.
是否有一个具体的例子说明"能够使用先前计算的输出来决定接下来要运行的计算",Applicative没有?
这个问题的目的是只为我和许多像我这样的人获取知识或信息.
所以我的问题是:
是否有必要在循环或函数之前初始化/声明变量?
问这个问题是我的困惑,因为我之前是否初始化/声明变量我的代码是否仍然有效.
我正在分享我实际意思的演示代码:
$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)
这两段代码对我来说都是一样的,所以在开始时初始化/声明一个变量是必要的吗?
我对此查询的执行顺序感到困惑,请解释一下.我很困惑何时应用连接,调用函数,随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) 尝试做一些简单的事情时,我遇到了一个令人困惑的错误消息
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,以及如何解释它?
谢谢
我正在尝试编写一个模板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 *,还int和double.以上代码输出:
1, 1, 1
Run Code Online (Sandbox Code Playgroud)
(截至gcc-4.8.1).
我的问题是如何修复is_c_str以正确捕获C风格的字符串?
新发布的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) 我正在阅读像这样的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.
已经很好地讨论了对象关系映射,包括在这里.我有一些方法的经验,陷阱和妥协.真正的分辨率似乎需要更改OO或关系模型本身.
如果使用功能语言,是否会出现同样的问题?在我看来,这两种范式应该比OO和RDBMS更好地融合在一起.在RDBMS中进行思考的想法似乎与功能方法似乎承诺的自动并行性相匹配.
有没有人有任何有趣的意见或见解?这个行业的状况如何?
我正在玩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'版本)如果显式转换为适当的函数<>类型,则可以接受.
所以我的问题是:
为什么lambda函数首先没有function<>类型?在小例子中,为什么不addInt_l具有function<int (int,int)>类型而不是具有不同的lambda类型?从函数式编程的角度来看,函数/函数对象和lambda之间有什么区别?
如果存在这两者必须不同的根本原因.我听说lambda可以转换为function<>但它们是不同的.这是C++ 11,一个执行问题是设计问题/缺陷还是有区分两者,因为它是方式的好处?似乎addInt_l单独的类型签名提供了关于函数的参数和返回类型的足够信息.
有没有办法编写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++ ×5
c++11 ×4
gcc ×2
applicative ×1
c++20 ×1
database ×1
declaration ×1
haskell ×1
iostream ×1
lambda ×1
monads ×1
orm ×1
php ×1
postgis ×1
postgresql ×1
rdbms ×1
sql-server ×1
stl ×1
templates ×1
type-traits ×1
variables ×1
wkb ×1