我有这样的数据结构:
struct foo {
int id;
int route;
int backup_route;
int current_route;
}
以及一个名为update()的函数,用于请求对其进行更改.
update(42, dont_care, dont_care, new_route);
这真的很长,如果我在结构中添加一些内容,我必须在每次调用更新(...)时添加'dont_care'.
我正在考虑将结构传递给它,但事先用'dont_care'填充结构比在函数调用中拼写它更加繁琐.我可以使用默认值dont care在某处创建结构,并在我将其声明为局部变量后设置我关心的字段吗?
struct foo bar = { .id = 42, .current_route = new_route };
update(&bar);
将我希望表达的信息传递给更新功能的最优雅的方法是什么?
我希望其他一切都默认为-1("不关心"的密码)
以下程序是使用VC++ 2012编译的.
#include <algorithm>
struct A
{
A()
: a()
{}
bool operator <(const A& other) const
{
return a <= other.a;
}
int a;
};
int main()
{
A coll[8];
std::sort(&coll[0], &coll[8]); // Crash!!!
}
Run Code Online (Sandbox Code Playgroud)
如果我return a <= other.a;改为return a < other.a;那么程序按预期运行,没有例外.
为什么?
假设我有一个std::map<int, int>,这样做是否安全?
std::map<int, int> m_map;
m_map[0] += 1;
Run Code Online (Sandbox Code Playgroud)
如果0我执行此操作时地图中不存在该键,它将如何知道要添加的值1?
我希望std :: map通过执行=而不是+=在值在地图中创建新条目的情况来处理此问题.这将使我不必这样做:
std::map<int, int>::iterator it = m_map.find(0);
if(it != m_map.end()) {
it->second += 1;
}
else {
m_map[0] = 1;
}
Run Code Online (Sandbox Code Playgroud) 出于某种原因,如果len <3,我将在delete []缓冲行中得到堆损坏错误.
case WM_COMMAND:
{
switch(LOWORD(wParam))
{
case ID_BUTTON_OK:
{
int len = SendMessage(mapName, WM_GETTEXTLENGTH, 0, 0);
char* buffer = new char[len+1];
ZeroMemory(buffer,sizeof(buffer));
len = SendMessage(mapName, WM_GETTEXT, (WPARAM)len+1, (LPARAM)buffer);
if(isMapNameLegal(buffer)) // Makes sure the map name is legal
{
}
else
{
MessageBox(NULL,"The map name is illegal","Error",MB_ICONERROR);
}
delete[] buffer;
}
break;
Run Code Online (Sandbox Code Playgroud)
有isMapNameLegal.顺便说一句,它是静态的:
bool Creator::isMapNameLegal(char* name)
{
if(strlen(name)<=3)
return false;
int x=0;
while(name[x]!='\0')
{
if(name[x]<48 && name[x]!=32) //32=='\r', 48==0,
return false;
if(name[x]>57 && name[x]<65) //57==9, 65==A
return false;
if(name[x]>90 …Run Code Online (Sandbox Code Playgroud)