相关疑难解决方法(0)

我在哪里可以获得"有用的"C++二进制搜索算法?

我需要一个与C++ STL容器兼容的二进制搜索算法,类似于std::binary_search标准库的<algorithm>头文件,但我需要它返回指向结果的迭代器,而不是一个简单的布尔值告诉我元素是否存在.

(另一方面,当他们为binary_search定义API时,标准委员会在想什么?!)

我主要担心的是我需要二进制搜索的速度,所以尽管我可以用其他算法找到数据,如下所述,我想利用我的数据被排序以获得二进制的好处这一事实搜索,而不是线性搜索.

到目前为止lower_bound,upper_bound如果缺少基准则失败:

//lousy pseudo code
vector(1,2,3,4,6,7,8,9,0) //notice no 5
iter = lower_bound_or_upper_bound(start,end,5)
iter != 5 && iter !=end //not returning end as usual, instead it'll return 4 or 6
Run Code Online (Sandbox Code Playgroud)

注意:我也可以使用不属于std命名空间的算法,只要它与容器兼容即可.就像说,boost::binary_search.

c++ algorithm stl binary-search

101
推荐指数
3
解决办法
4万
查看次数

C++,我可以在编译时静态初始化std :: map吗?

如果我编码这个

std::map<int, char> example = {
                                (1, 'a'),
                                (2, 'b'),
                                (3, 'c') 
                              };
Run Code Online (Sandbox Code Playgroud)

然后g ++对我说

deducing from brace-enclosed initializer list requires #include <initializer_list>
in C++98 ‘example’ must be initialized by constructor, not by ‘{...}’   
Run Code Online (Sandbox Code Playgroud)

这让我很烦,因为构造函数是运行时的,理论上可能会失败.

当然,如果确实如此,它将很快失败并且应该一直这样做,所以我应该快速找到并纠正问题.

但是,我仍然很好奇 - 无论如何在编译时初始化地图,矢量等?


编辑:我应该说我正在为嵌入式系统开发.并非所有处理器都具有C++ 0x编译器.最受欢迎的可能是,但我不想遇到问题并且必须维护2个版本的代码.

至于Boost,我尚未决定.他们在嵌入式系统中使用他们的有限状态机类是多么的愚蠢,所以这就是我在这里编写的事件/事件/状态/ Fsm类.

叹了口气,我想我最好安全地玩,但我希望这个讨论对其他人有帮助.

c++ embedded stl

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

静态地图初始化

我有以下代码:我有以下代码:

//MyClass.h
class MyClass {
public:
      typedef std::map<std::string, int> OpMap;
      static OpMap opMap_;


     //methods
};

//MyClass.cpp
//Init opMap_
MyClass::opMap_["x"] = 1; //compilation error
Run Code Online (Sandbox Code Playgroud)

我怎么能初始化(静态)opMap_?

c++ static map

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

如何从静态列表构造Boost bimap?

我有这样一个bimap:

using MyBimap = boost::bimaps::bimap<
    boost::bimaps::unordered_set_of<A>,
    boost::bimaps::unordered_set_of<B>>;
Run Code Online (Sandbox Code Playgroud)

我想从静态初始化列表构造它,因为它可以为std::map:

MyBimap map{{a1, b1}, {a2, b2}, {a3, b3}};
Run Code Online (Sandbox Code Playgroud)

不幸的是,它不起作用,因为bimap不支持初始化列表,所以我尝试了一种解决方法.Boost的文档列出了以下构造函数:

 bimap();

 template< class InputIterator >
 bimap(InputIterator first,InputIterator last);

 bimap(const bimap &);
Run Code Online (Sandbox Code Playgroud)

所以我尝试了第二个,像这样:

std::vector<std::pair<A,B>> v{{a1, b1}, {a2, b2}, {a3, b3}};
MyBimap map(v.begin(), v.end());
Run Code Online (Sandbox Code Playgroud)

它也没用.文档并不完全清楚这个构造函数期望什么样的迭代器,但显然它不仅仅是std::pair<A, B>对象的迭代器.那么这个构造函数对这种bimap的期望是什么?

c++ boost c++11 boost-bimap

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

如何在C++ 11中编写地图文字?

在Python中,我可以像这样写一个地图文字:

mymap = {"one" : 1, "two" : 2, "three" : 3}
Run Code Online (Sandbox Code Playgroud)

如何在C++ 11中完成等效操作?

c++ map literals c++11

14
推荐指数
2
解决办法
1万
查看次数

如何构建编译时键/值存储?

我有一个问题,我需要在编译时将一个整数映射到另一个整数.基本上,我需要编译时相当于std::map<int,int>.如果在地图中找不到某个键,我想返回一个默认值.

我想使用的界面:

template<unsigned int default_value,
         unsigned int key0, unsigned int value0,
         unsigned int key1, unsigned int value1,
         ...>
struct static_map
{
  ...
};

template<unsigned int key, typename StaticMap>
struct lookup
{
  static unsigned int value = ...
};
Run Code Online (Sandbox Code Playgroud)

lookup返回与相关联的值keyStaticMap.如果key未找到,则default_value返回.

在一般情况下,键/值对的数量将被限制一些> 2.什么是打造最好的方式来界定static_maplookup

我还要提一下,我仅限于使用C++ 03语言结构,因此没有C++ 11,也没有外部库依赖.


这是我得到的解决方案,受到nm和DyP的答案的启发:

#include <iostream>

template<unsigned int k, unsigned int v>
struct key_value
{
  static const unsigned int key = k;
  static const …
Run Code Online (Sandbox Code Playgroud)

c++ template-meta-programming

13
推荐指数
3
解决办法
9825
查看次数

派生类型的自动静态调用

有没有人知道一种方法,使派生类自动实例化一个模板类型的静态变量(这要么不需要派生类的编写器,或强迫他调用这个静态方法,以使派生类定义有效).

这可能是不可能理解的,我会尝试更好地定义它.

基本上我有一个全局工厂类,带有一个名为registerType的模板化函数.对于从Entity派生的每个类,我需要使用派生类型的模板参数调用此函数.目前,我必须在某个init函数中手动执行此操作,这会导致对此函数的大量调用,这违反了我的模板原则.

所以我有这个:

class Factory
{
  template <typename EntityType>
  registerEntityType();
};

void someInitFunction()
{
   /// All of these are derived from Entity
  gFactory.registerEntityType<EntityType1>();
  gFactory.registerEntityType<EntityType2>();
  gFactory.registerEntityType<EntityType3>();
  /// and so on
}
Run Code Online (Sandbox Code Playgroud)

而我宁愿这样:

class Factory
{
  template <typename EntityType>
  registerEntityType();
};

class Entity // Abstract
{
    /// This function should be called automatically with the derived 
    /// type as a parameter
    SomeStaticConstructor<MDerivedType>() 
    {
      gFactory.registerEntityType<MDerivedType>();
    }
};
Run Code Online (Sandbox Code Playgroud)

编辑:这是不起作用的静态重复模板代码:

这是我的基类,以及用于自动注册东西的类

template <typename DerivedType>
class Registrar
{
    public:
        Registrar();
        void check();
};
template <typename …
Run Code Online (Sandbox Code Playgroud)

c++ static templates

12
推荐指数
3
解决办法
1591
查看次数

c ++静态初始化map <float,float [3]>

所以我有一个地图myMap,我试图静态初始化(必须这样做).

我正在做以下事情:

myMap = 
{
    {415, {1, 52356, 2}}, 
    {256, {356, 23, 6}},
    //...etc
};
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误:"数组初始化程序必须是初始化程序列表."

我上面的语法有什么问题?

c++ arrays static list map

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

有没有办法缩短长的switch()语句?

我在switch()语句中处理了很多情况,并且想知道是否有任何可能的方式可以缩短这些情况。它们在我的代码中占用了很多空间,并且当这些语句有3-4个大块时,很难导航。这是一个例子:

...important lines of code...

void foo(string bar, bool blam) {

     int v1 = stoi(bar);

     switch (v1) {
         case(11):
             if(blam) {
                exArr[1] = "A";
             } else {
                exArr[1] = "B";
             }
             break;

         case(12):
             if(blam) {
                 exArr[3] = "A";
             } else {
                 exArr[3] = "B";
             }
             break;

         ...many more cases...

         default:
             printElement();
             break;
}
...even more important code, which is dependent on the hard code above and hard to navigate...
Run Code Online (Sandbox Code Playgroud)

我认为您看到了问题。你们有什么建议吗?提前致谢。

重要编辑:

仅前12次迭代会更改exArr的字符。之后,它将更改为另一个(现有的)数组,例如ndArr,需要另外12次迭代。这种情况适用于4个数组,因此大约有48个case语句。

c++ loops switch-statement

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

如何初始化静态std :: map?

我已经创建了一个仅消息窗口类,我正在尝试将HWND映射回具有这些句柄的对象.我正在尝试使用std::map<HWND, CMyClass*>属于该类的私有静态来执行此操作,如下所示:

MyClass.h:

class CMyClass
{
    ...

private:
    HWND        m_hWnd;
    HINSTANCE   m_hInstance;
    LPCSTR      m_szClassName;

    static std::map<HWND, CMyClass*> s_mapHandles;

    ...
};
Run Code Online (Sandbox Code Playgroud)

MyClass.cpp:

std::map<HWND, CMyClass*> CMyClass::s_mapHandles;
Run Code Online (Sandbox Code Playgroud)

但是当我尝试添加到地图时,程序崩溃了.我尝试了三种不同的形式,它们都给出了同样的错误:

...
m_hWnd = ::CreateWindowEx(0, m_szClassName, "Message Window", 0, 0, 0, 0, 0, HWND_MESSAGE, 0, m_hInstance, 0);
s_mapHandles.insert(pair<HWND, CMyClass*>(m_hWnd, this));
Run Code Online (Sandbox Code Playgroud)

要么

...
s_mapHandles.insert(s_mapHandles.end(), pair<HWND, CMyClass*>(m_hWnd, this));
Run Code Online (Sandbox Code Playgroud)

甚至

...
s_mapHandles[m_hWnd] = this;
Run Code Online (Sandbox Code Playgroud)

在每种情况下,_Root()尝试返回的调用都会发生崩溃_Parent(_Myhead); _Parent(_Myhead)返回(_Nodepref)(*_Myhead)._Parent失败,因为_Myhead为null.

如何初始化地图,使其头部非空,我可以在不崩溃的情况下插入内容?如果我解释得很糟糕,我会道歉 - 我是C++的新手.

c++ dll stl stdmap

3
推荐指数
1
解决办法
5035
查看次数