如果存在std::map<std::pair<std::string, std::string>, some_type>找到其值的最佳方法是什么?
我想最明显的一个是做这样的事情:
但这将导致在对构造期间对和字符串map.find(std::make_pair(str1, str2));
进行复制构造。str1str2
我希望也许map.find(std::make_pair(std::ref(str1), std::ref(str2)));能有所帮助,但不幸的是没有,这仍然会产生字符串副本。
map.find(std::make_pair(std::move(str1), std::move(str2))应该可以工作,但我们假设这些字符串 ( str1, str2) 是 const 或者不应该移动。
所以我问是否有其他方法可以进行地图搜索而不进行多余的字符串副本?
(请注意,使用std::string_viewforstd::map key不是一个选项,因为地图应该拥有其字符串。)
请考虑以下代码:
int fac_aux( int x, int res ) {
if( x == 1 ) return res;
else return fac_aux( x - 1, res * x );
}
int fac( int x ) {
return fac_aux( x, 1 );
}
int main() {
int x = fac( 50 );
std::cout << x;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
根据生成的asm文件一切正常,尾调用优化.
尝试更换
int x = fac( 50 );
Run Code Online (Sandbox Code Playgroud)
同
int x = fac_aux( 50, 1 );
Run Code Online (Sandbox Code Playgroud)
奇怪,但尾调用优化消失了.据我所知,在VS2008中没有这么奇怪的编译器行为.任何有关这些事情发生的想法以及如何确保尾部调用优化都已完成?
; 函数编译标志:/ Ogtp
尝试了/ O2和/ Ox优化标志.是否有其他重要的编译器选项?
编辑:VS2012设法进行优化
有没有办法让这项工作?我希望你能得到这个想法,我试图通过递归对创建一个列表
#include <boost/variant.hpp>
#include <utility>
struct nil {};
typedef boost::make_recursive_variant<nil, std::pair<int, boost::recursive_variant_ >>::type list_t;
int main() {
list_t list = { 1, (list_t){ 2, (list_t){ 3, nil() } } };
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我希望定义一个新的nofication id,它将在我的子类控件的WM_COMMAND消息中使用.但我没有找到任何创建用户控件定义的通知代码的规则.
boost :: math是否有任何可用于帮助实现类似于MS Excel LINEST函数的函数的函数?