小编use*_*967的帖子

C字符串映射键

使用C字符串作为地图密钥有什么问题吗?

std::map<const char*, int> imap;
Run Code Online (Sandbox Code Playgroud)

地图中元素的顺序无关紧要,所以如果按顺序使用它们也没关系std::less<const char*>.

我正在使用Visual Studio并根据MSDN(Microsoft特定):

在某些情况下,可以"合并"相同的字符串文字以节省可执行文件中的空间.在字符串文字池中,编译器会将对特定字符串文字的所有引用指向内存中的相同位置,而不是让每个引用指向字符串文字的单独实例.

它说它们仅在某些情况下被合并,所以看起来使用字符串文字访问地图元素似乎是一个坏主意:

//Could these be referring to different map elements?
int i = imap["hello"];
int j = imap["hello"];
Run Code Online (Sandbox Code Playgroud)

是否可以重载operator==const char*使实际的C字符串而不是指针值用于确定映射元素是否相等:

bool operator==(const char* a, const char* b)
{
    return strcmp(a, b) == 0 ? true : false;
}
Run Code Online (Sandbox Code Playgroud)

使用C字符串作为映射键是否是一个好主意?

c++ map cstring

4
推荐指数
2
解决办法
9173
查看次数

Win32:更改程序图标

我最初认为IDI_ICON1非常适合我的程序:

wndclass.hIcon         = LoadIcon (HINST_THISCOMPONENT, MAKEINTRESOURCE(IDI_ICON1));
Run Code Online (Sandbox Code Playgroud)

然后,该图标出现在我的主窗口标题菜单的左上角和Windows资源管理器中的.exe文件的左上角.

我觉得我更喜欢IDI_ICON2,所以我改变了:

wndclass.hIcon         = LoadIcon (HINST_THISCOMPONENT, MAKEINTRESOURCE(IDI_ICON2));
Run Code Online (Sandbox Code Playgroud)

现在icon2出现在标题菜单的左上角,但Windows资源管理器中的图标仍显示为icon1.我错过了什么?

c++ resources visual-studio-2010

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

动态分配3d数组

关于动态分配3d数组我有点困惑.现在,我只是像这样分配一大块内存:

int height = 10;
int depth = 20;
int width = 5;

int* arr;
arr = new int[height * width * depth];
Run Code Online (Sandbox Code Playgroud)

现在我想更改3D数组中的值,例如:

//arr[depth][width][height]
arr[6][3][7] = 4;
Run Code Online (Sandbox Code Playgroud)

但是,我无法使用上面的代码来更改值.如何使用单个索引访问位置深度= 6,宽度= 3,高度= 7的元素?

arr[?] = 4;
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来动态分配3D数组?

c++ dynamic multidimensional-array

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

c ++指针算术

int a[5];

cout << &a[1] << " " << &a[0] << endl;
cout << (&a[1] - &a[0]);
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,为什么&a [1] - &a [0]等于1而不是4?因为我们有一个int数组,所以这些地址之间不应该有4个字节吗?

c++ memory pointers

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

signed/unsigned int mismatch

以下程序给出了签名/未签名的不匹配警告:

#include <iostream>

int main()
{
unsigned int a = 2;
int b = -2;

if(a < b)
    std::cout << "a is less than b!";

return 0;
}
Run Code Online (Sandbox Code Playgroud)

我想在混合有符号和无符号的整数时理解这个问题.根据我的说法,int通常使用二进制补码存储在内存中.

所以,假设我有数字2.根据我的理解,它将在内存中表示如下:

00000000 00000000 00000000 00000010
Run Code Online (Sandbox Code Playgroud)

-2将表示为一个人的赞美加1,或者:

11111111 11111111 11111111 11111110
Run Code Online (Sandbox Code Playgroud)

有了两个赞美,没有像"符号和幅度方法"那样保留标志.如果没有符号位,为什么无符号整数能够存储更大的正数?混合有符号/无符号整数时可能出现的问题示例是什么?

c++

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

视觉工作室断点

我有一个关于在Visual Studio 2010 Professional中设置断点的问题.

在下面的结构中,我有一个Update()函数,根据某些条件,更新它的成员的值i:

struct A
{
    A(int i) : i(i) {}

    void Update()
    {
        //Update i if some condition is met...
        if(something)
            i += 2;
    }

    int i;
};

int main()
{
    A a(2);

    //Update is usually called periodically...
    a.Update();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我想在i等于4 时设置一个断点.我知道如何执行此操作的唯一方法是更改​​Update()函数,如下所示:

void Update()
{
        //Update i if some condition is met...
        if(something)
            i += 2;

        if(i == 4)
            int dummy = 1;
}
Run Code Online (Sandbox Code Playgroud)

现在我可以在线上设置一个断点:

int dummy = 1; …
Run Code Online (Sandbox Code Playgroud)

c++ debugging visual-studio-2010

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

在析构函数中调用继承的IUnknown :: Release()

为什么在析构函数中的IWICImagingFactory对象上调用继承的IUnknown :: Release()函数会导致在对象的虚函数表(__vfptr)中显示每个条目的"CXX0030:错误:无法计算表达式"?

这是参考我发布的早期问题,但我已经意识到问题只发生在析构函数中.虚拟功能表在我检查过的任何其他地方都有效.但是,一旦在析构函数中,所有条目都显示CXX0030错误,并且尝试调用继承的IUknown :: Release()失败.

编辑:这是一些代码来演示:

HRESULT DemoApp::CreateDeviceIndependentResources()
{
HRESULT hr;


hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &mpDirect2DFactory);


if (SUCCEEDED(hr))
{
    hr = CoCreateInstance(
        CLSID_WICImagingFactory,
        NULL,
        CLSCTX_INPROC_SERVER,
        IID_PPV_ARGS(&mpWICFactory)
        );
}

//CoCreateInstance returns S_OK.
//Other unrelated code here.
}

HRESULT DemoApp::CreateDeviceResources()
{
HRESULT hr;
//Other unrelated code here for creating device-dependant resources.
//mpBackgroundBitmap is a ID2D1Bitmap*.
    if(SUCCEEDED(hr))
    {
        hr = LoadBitmapFromFile(
            mpRenderTarget,
            mpWICFactory,
            L".\\background.png",
            0,
            0,
            &mpBackgroundBitmap);
    }
}


//The below LoadBitmapFromFile() code is taken directly from an MSDN sample.
//I didn't write …
Run Code Online (Sandbox Code Playgroud)

c++ com directx virtual-destructor

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

严格的弱序排列混乱

我对严格的弱排序以及如何在定义operator <时使用它感到困惑.我有几个结构:

struct Plane
{
    std::string name;

    int xrudder;
    int yrudder;

    int wingwidgets;

    bool hasLegacyEngine;
};


struct Airport
{
    bool securityCheck;
    unsigned __int64 capacity;

    std::vector<Plane> planes;
};
Run Code Online (Sandbox Code Playgroud)

我想创建一个std::set机场.我需要定义operator <,它使用严格的弱排序,但我不确切地知道这意味着什么和/或如何做.

struct cmpless
{
bool operator()(const Airport& left, const Airport& right)
    {
        //?
    }
}; 

std::set<Airport, cmpless> airportSet;
Run Code Online (Sandbox Code Playgroud)

一个机场"小于"另一个机场没有意义.只有机场根据他们的统计数据相等才有意义.

我如何确定我对operator <的定义将遵循严格的弱排序?我如何开始考虑operator<在这种情况下进行定义?

如果可能的话,一个解释的例子会很棒!

c++ operator-overloading set strict-weak-ordering

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

调用堆栈字节偏移量

Call StackVisual Studio 2010 的窗口中,字节偏移量指的是行号旁边的内容?

Test.exe!__tmainCRTStartup()  Line 547 + 0x2c bytes
Run Code Online (Sandbox Code Playgroud)

为什么有些堆栈帧有字节偏移而其他堆栈帧没有?

c++ visual-studio-2010

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

reinterpret_cast vs c style cast

可能重复:
c-style cast vs reinterpret_cast

有什么区别:

A* pA = new B;

B* p1 = (B*)pA;
B* p2 = reinterpret_cast<B*>(pA);
Run Code Online (Sandbox Code Playgroud)

他们都是做同样事情的相同方式吗?有没有理由选择一个而不是另一个?是否应该在C++代码中避免"C风格"演员表?

c++

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