所以,我得到了这个:
struct People_Info {
bool isWorking;
std::string name;
int age;
float height;
};
int counter = 0;
int random = urand(1, 4);
std::map<uin64, People_Info> PeopleMap;
Run Code Online (Sandbox Code Playgroud)
现在,将调用一个函数,该函数将使用此结构在映射中创建一个条目,该结构将设置一些默认值:
PeopleMap[counter].isWorking = false;
PeopleMap[counter].name = "Mr";
PeopleMap[counter].age = 1;
PeopleMap[counter].height = 1.60f;
counter++;
Run Code Online (Sandbox Code Playgroud)
现在,这个函数应该为新人创建一个条目,但是,在整个脚本中,我将删除一些条目,所以如果我有 5 个元素,并且我删除第二个元素,那么,我想编辑地图上的每个人:
for(int i = 0; i < 5 ; i++) {
if(PeopleMap[i] == PeopleMap.end()) // Don't edit map entries that are erased
continue;
PeopleMap[i].isWorking = true;
}
Run Code Online (Sandbox Code Playgroud)
现在,由于某种原因它仍在编辑所有条目,我是否需要使用 new 为每个条目创建一个结构?
我想跟踪特定成员变量何时更改值,以便可以将其打印出来。现在,明显的解决方案是在成员的Set方法中添加跟踪功能,如下所示:
class Foo
{
public:
Foo() {}
void SetBar(int value)
{
//Log that m_bar is going to be changed
m_bar = value;
}
private:
int m_bar; // the variable we want to track
};
Run Code Online (Sandbox Code Playgroud)
我面临的问题是我正在开发一个大型项目,并且某些类具有许多内部更改成员变量而不是调用其Setter的方法。
m_bar = somevalue;
Run Code Online (Sandbox Code Playgroud)
代替 :
SetBar(somevalue);
Run Code Online (Sandbox Code Playgroud)
所以我想知道是否有一种更快/更干净的方法来实现我想要的,而不是仅仅将每个更改m_bar =为SetBar(。赋值运算符可能仅对该成员变量重载?
我一直被告知(并且一直在告诉)const,即使对于寿命很短的变量,保持- 正确性也是有价值和良好的做法,例如:
const std::string a = "Hello world";
Run Code Online (Sandbox Code Playgroud)
代替
std::string a = "Hello world";
Run Code Online (Sandbox Code Playgroud)
这个:
尽管自从现代C ++引入复制省略功能以来,标准中已有一些子句允许编译器调用move构造函数而不是复制构造函数:
在以下复制初始化上下文中,可以使用移动操作代替复制操作:
(3.1) 如果
return语句([stmt.return])中的表达式是一个(可能带有括号的)id表达式,该对象使用在最里面的封闭函数或lambda的主体或参数声明子句中声明的具有自动存储期限的对象进行命名-表达式,或(3.2) 如果
throw-expression[[expr.throw])的操作数是非易失性自动对象(函数或catch子句参数除外)的名称,其范围不会超出最内层封闭的结尾try-block(如果有一个),
这是否意味着使用const带有非默认复制/移动构造函数的对象实际上会产生性能损失,而不是在遇到这种省略的情况时会增加性能吗?
我有这个奇怪的问题,我的机器和生产服务器上的字符串转换得到不同的结果,例如:
procedure TForm1.Button1Click(Sender: TObject);
var
s1: string;
f1: double;
begin
s1 := '1.234';
f1 := StrToFloat(s1);
end;
procedure TForm1.Button2Click(Sender: TObject);
var
s2: string;
f2: double;
begin
s2 := '1,234';
f2 := StrToFloat(s2);
end;
Run Code Online (Sandbox Code Playgroud)
在我的WinXP机器上的'1.234'中的Button1Click结果不是有效的浮点值,而在Win2K机器上这可以正常工作.
另一端的Button2Click在我的WinXP上运行,但确实导致'1,234'不是有效的浮点值错误.
两台机器都将区域设置设置为"德语(奥地利)" - 任何关于为什么会发生这种情况的想法,或者至少为什么区域设置对话框确实显示与Delphi"DecimalSeparator"和"GetLocaleChar(GetThreadLocale,LOCALE_SDECIMAL)不同的十进制分隔符,'.')?
此致,Reinhard
我最近读过如何std::move通过移动值而不是复制它来加速代码.所以我制作了一个测试程序来比较速度std::vector.
代码:
#include <iostream>
#include <vector>
#include <stdint.h>
#ifdef WIN32
#include <Windows.h>
#else
#include <sys/time.h>
#include <ctime>
#endif
#undef max
// Returns the amount of milliseconds elapsed since the UNIX epoch. Works on both
// windows and linux.
uint64_t GetTimeMs64()
{
#ifdef _WIN32
// Windows
FILETIME ft;
LARGE_INTEGER li;
// Get the amount of 100 nano seconds intervals elapsed since January 1, 1601 (UTC) and copy it
// to a LARGE_INTEGER structure.
GetSystemTimeAsFileTime(&ft);
li.LowPart = ft.dwLowDateTime; …Run Code Online (Sandbox Code Playgroud) c++ optimization return-value-optimization c++11 visual-studio-2015
我正在阅读着名的Undefined Behavior会导致时间旅行发布并注意到这一部分:
首先,您可能会注意到循环控件中的逐个错误.结果是函数在放弃之前读取一个超过表数组末尾的函数.经典的编译器不会特别在意.它只会生成读取越界数组元素的代码(尽管事实上这样做违反了语言规则),如果超过数组末尾的内存碰巧匹配,它将返回true .
另一方面,后经典编译器可能会执行以下分析:
通过循环的前四次,函数可能返回true.
当我是4时,代码执行未定义的行为.由于未定义的行为让我可以做任何我想做的事情,我可以完全忽略这种情况并继续假设我从来没有4.(如果假设被违反,那么会发生一些不可预测的事情,但这没关系,因为未定义的行为授予我许可无法预测.)
根据这篇文章,(较新的)编译器已经可以在编译时对未定义的行为起作用,这意味着它在某些情况下完全能够发现未定义的行为.通过消除UB代码或仅仅改变它来让恶魔飞出你的鼻子或产生龙,而不是让它为什么不允许编译器发出警告,这可能不是故意的?
如果我的编译器支持这些预定义的宏(__FILE__, __LINE__, __func__),那么我可以安全地使用它们并假设它将始终根据以下内容报告正确的文件和行:__ FILE __, _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
我还读到变量名,行号等与执行的程序集结束代码(从.cpp代码生成的实际.exe文件)无关,如果是这种情况那么这些宏在使用时如何工作在代码?如何__LINE__用汇编代码表示宏?.exe文件在遇到__LINE__宏时如何知道原始.cpp源的正确行号?
我有这个代码:
map< int , vector< int>> testmap;
vector<int> testvector;
testvector.push_back(10);
testmap.insert(1, testvector);
Run Code Online (Sandbox Code Playgroud)
这段代码给了我一个错误,告诉我没有重载函数来匹配参数列表.
谁能告诉我为什么会这样?我正在尝试将矢量插入到地图中,但此方法似乎不起作用.
我今天偶然发现了一些代码,我将其简化为:
#include <iostream>
using std::cout;
using std::cin;
bool changeX(int &x)
{
x = 5;
return true;
}
void printvals(bool bval, int intval)
{
cout << bval << " : " << intval;
}
int main()
{
int x;
printvals(changeX(x), x);
cin.get();
}
Run Code Online (Sandbox Code Playgroud)
在这里x传递给函数时仍未初始化,printvals但是我可以肯定地说,在printvals使用它之前x将始终被初始化吗?我尝试在VS2013调试模式下运行我的简化代码,这给了我:Run-Time Check Failure #3 - The variable 'x' is being used without being initialized..但是,在发布模式下运行它运行正常并打印:1 : 5正如预期的那样.
这是否意味着我可以在生产代码中使用这种方法?将x之前总是被初始化printvals可以使用它,所以它不会导致UB?
在课堂体中定义一个函数时,你总是声明它或者你会怎么说?这是一个例子:
class ss
{
ss() {}
};
Run Code Online (Sandbox Code Playgroud)
我们然后声明构造函数,定义构造函数,或声明AND定义构造函数.你能说些什么呢?
c++ ×9
c++11 ×2
class ×1
copy-elision ×1
delphi ×1
delphi-5 ×1
dictionary ×1
function ×1
insert ×1
macros ×1
map ×1
optimization ×1
struct ×1
vector ×1