小编Som*_*ken的帖子

带有结构体的 C++ 映射

所以,我得到了这个:

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 为每个条目创建一个结构?

c++ struct dictionary

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

跟踪成员变量值更改

我想跟踪特定成员变量何时更改值,以便可以将其打印出来。现在,明显的解决方案是在成员的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(。赋值运算符可能仅对该成员变量重载?

c++ class c++11

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

非平凡变量的常量正确性

(尽管与无关,但仍受此答案的启发)

我一直被告知(并且一直在告诉)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带有非默认复制/移动构造函数的对象实际上会产生性能损失,而不是在遇到这种省略的情况时会增加性能吗?

c++ copy-elision

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

Delphi 5 - StrXoFloat在WinXP和Win2K上的结果不同

我有这个奇怪的问题,我的机器和生产服务器上的字符串转换得到不同的结果,例如:

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

delphi delphi-5

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

std :: move和RVO优化

我最近读过如何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

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

如果可能存在未定义的行为,为什么编译器不会警告您?

我正在阅读着名的Undefined Behavior会导致时间旅行发布并注意到这一部分:

首先,您可能会注意到循环控件中的逐个错误.结果是函数在放弃之前读取一个超过表数组末尾的函数.经典的编译器不会特别在意.它只会生成读取越界数组元素的代码(尽管事实上这样做违反了语言规则),如果超过数组末尾的内存碰巧匹配,它将返回true .

另一方面,后经典编译器可能会执行以下分析:

通过循环的前四次,函数可能返回true.

当我是4时,代码执行未定义的行为.由于未定义的行为让我可以做任何我想做的事情,我可以完全忽略这种情况并继续假设我从来没有4.(如果假设被违反,那么会发生一些不可预测的事情,但这没关系,因为未定义的行为授予我许可无法预测.)

根据这篇文章,(较新的)编译器已经可以在编译时对未定义的行为起作用,这意味着它在某些情况下完全能够发现未定义的行为.通过消除UB代码或仅仅改变它来让恶魔飞出你的鼻子或产生龙,而不是让它为什么不允许编译器发出警告,这可能不是故意的?

c++ undefined-behavior

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

预定义宏的__FILE __,_ _ _ _,_ _ func __,字符串化(#)如何工作?

如果我的编译器支持这些预定义的宏(__FILE__, __LINE__, __func__),那么我可以安全地使用它们并假设它将始终根据以下内容报告正确的文件和行:__ FILE __, _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

我还读到变量名,行号等与执行的程序集结束代码(从.cpp代码生成的实际.exe文件)无关,如果是这种情况那么这些宏在使用时如何工作在代码?如何__LINE__用汇编代码表示宏?.exe文件在遇到__LINE__宏时如何知道原始.cpp源的正确行号?

c++ macros

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

使用类型<int,vector <int >>插入到map中

我有这个代码:

map< int , vector< int>> testmap;
vector<int> testvector;
testvector.push_back(10);
testmap.insert(1, testvector);
Run Code Online (Sandbox Code Playgroud)

这段代码给了我一个错误,告诉我没有重载函数来匹配参数列表.

谁能告诉我为什么会这样?我正在尝试将矢量插入到地图中,但此方法似乎不起作用.

c++ insert vector map

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

传递未初始化的变量安全

我今天偶然发现了一些代码,我将其简化为:

#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?

c++ function undefined-behavior

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

在定义函数时,您是否也在声明它?

在课堂体中定义一个函数时,你总是声明它或者你会怎么说?这是一个例子:

class ss 
{
ss() {}
};
Run Code Online (Sandbox Code Playgroud)

我们然后声明构造函数,定义构造函数,或声明AND定义构造函数.你能说些什么呢?

c++

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