小编Voi*_*oid的帖子

以 std::pair 作为键透明搜索 std::map

如果存在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不是一个选项,因为地图应该拥有其字符串。)

c++ stdmap std

23
推荐指数
2
解决办法
1145
查看次数

vs2010 c ++尾调用优化

请考虑以下代码:

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设法进行优化

c++ visual-studio-2010 tail-call-optimization visual-c++

10
推荐指数
1
解决办法
1310
查看次数

boost :: variant递归麻烦

有没有办法让这项工作?我希望你能得到这个想法,我试图通过递归对创建一个列表

#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)

c++ boost-variant c++11

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

WM_COMMAND WM_NOTIFY自定义通知代码

我希望定义一个新的nofication id,它将在我的子类控件的WM_COMMAND消息中使用.但我没有找到任何创建用户控件定义的通知代码的规则.

winapi mfc

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

有没有办法使用boost库实现Excel LINEST函数?

boost :: math是否有任何可用于帮助实现类似于MS Excel LINEST函数的函数的函数?

c++ math excel boost

0
推荐指数
1
解决办法
438
查看次数