使用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字符串作为映射键是否是一个好主意?
我最初认为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.我错过了什么?
关于动态分配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数组?
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个字节吗?
以下程序给出了签名/未签名的不匹配警告:
#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)
有了两个赞美,没有像"符号和幅度方法"那样保留标志.如果没有符号位,为什么无符号整数能够存储更大的正数?混合有符号/无符号整数时可能出现的问题示例是什么?
我有一个关于在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) 为什么在析构函数中的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) 我对严格的弱排序以及如何在定义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<在这种情况下进行定义?
如果可能的话,一个解释的例子会很棒!
在Call StackVisual Studio 2010 的窗口中,字节偏移量指的是行号旁边的内容?
Test.exe!__tmainCRTStartup() Line 547 + 0x2c bytes
Run Code Online (Sandbox Code Playgroud)
为什么有些堆栈帧有字节偏移而其他堆栈帧没有?
有什么区别:
A* pA = new B;
B* p1 = (B*)pA;
B* p2 = reinterpret_cast<B*>(pA);
Run Code Online (Sandbox Code Playgroud)
他们都是做同样事情的相同方式吗?有没有理由选择一个而不是另一个?是否应该在C++代码中避免"C风格"演员表?