相关疑难解决方法(0)

964
推荐指数
5
解决办法
11万
查看次数

std :: map内置类型的默认值

最近,我被std :: map operator []函数搞糊涂了.在MSDN库中,它说:"如果找不到参数键值,那么它将与数据类型的默认值一起插入." 我试图更准确地搜索这个问题的解释.例如: std :: map default value 在这个页面中,Michael Anderson说"默认值是由默认构造函数(零参数构造函数)构造的".

现在我的任务是:"内置类型的默认值是什么?".编译器是否相关?或者c ++标准委员会是否有这个问题的标准?

我在visual studio 2008上对"int"类型进行了测试,发现"int"类型的构造值为0.

c++ stdmap default-value

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

添加到std :: map的元素是否自动初始化?

假设我有一张地图

std::map<int, double> foo;

是否foo[2] += 3.0;定义了我写作的行为?也就是说,0.0在我的情况下,是否有任何隐式添加的地图元素自动初始化(希望如此)?

如果没有,我是否引入了卡车装载的未定义行为?如果是这样,我可以用分配器做一些时髦的事情来强制执行初始化0.0吗?

c++ dictionary initialization

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

基本类型的C++类包装器

我见过/使用过的许多库都有typedef来提供可移植的,固定大小的变量,例如int8,uint8,int16,uint16等,无论平台如何,它们都是正确的大小(而c ++ 11本身就带有标题stdint. H)

最近在我正在编写的小型库中使用二进制文件i/o后,我可以看到以这种方式使用typedef以确保代码可移植的好处.

但是,如果我要输入"namespace :: uint32"而不是使用内置基本类型的麻烦,我也可以让替换尽可能有用.因此我正在考虑使用类而不是简单的typedef.

这些包装类将实现所有普通运算符,因此可以与基本类型互换使用.

例如:

int x = 0;
//do stuff
Run Code Online (Sandbox Code Playgroud)

可能成为

class intWrapper {
//whatever
};

intWrapper = 0;
//do stuff
Run Code Online (Sandbox Code Playgroud)

无需修改"// do stuff"中的任何代码

我正在考虑这种方法而不仅仅是typedef的原因是我已经拥有对基本类型进行操作的函数,例如

std::string numberToString(double toConvert);

std::string numberToHexString(double toConvert);

int intToXSignificantPlaces(const int& number, 
                               unsigned char numberOfSignificantPlaces);

bool numbersAreApproximatelyEqual(float tollerance);
//etc....
Run Code Online (Sandbox Code Playgroud)

从语法上讲,执行以下操作会更好(并且更多oop):

intWrapper.toString();
intWrapper.toHexString();
//etc
Run Code Online (Sandbox Code Playgroud)

此外,它允许我实现bigint类(int128等)并使那些和较小的(基于基本类型)使用相同的接口.

最后,每个包装器都可以有一个自己的静态实例,叫做max和min,所以int32 :: max和int32 :: min的语法很好.

但是,在我这样做之前,我想要解决一些问题(因为它主要是语法糖,并且这些类型会被使用,所以通常任何额外的开销都会对性能产生重大影响).

1)当使用someClass.operator +(),someClass.operator-()等而不是int a + int b时,是否有任何额外的函数调用开销?如果是这样,内联运算符+()会消除所有这些开销吗?

2)所有外部函数都需要基本类型,例如glVertex3f(float,float,float)不能简单地传递3个floatWrapper对象,有没有办法自动使编译器将floatWrapper转换为float?如果是这样,是否会产生性能影响?

3)是否有额外的内存开销?我理解(?)具有继承的类具有某种虚拟表指针,因此使用稍多的内存(或者仅仅用于虚函数?),但假设这些包装类不是从子类继承而不是子类,那么任何额外的内存使用使用类而不是基本类型,是吗?

4)这可能导致其他任何问题/性能影响吗?

c++ portability types typedef wrapper

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

在指针定义的行为映射中是否为nullptr的默认值?

以下代码似乎始终遵循true分支.

#include <map>
#include <iostream>

class TestClass {
  // implementation 
}

int main() {
  std::map<int, TestClass*> TestMap;
  if (TestMap[203] == nullptr) {
    std::cout << "true";
  } else {
    std::cout << "false";
  }
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

它是否为未初始化的指针定义了行为nullptr,或者是我的编译器的工件?

如果没有,我如何确保以下代码的可移植性?目前,我正在使用类似的逻辑来返回正确的单例实例log file:

#include <string>
#include <map>    

class Log {
  public:
    static Log* get_instance(std::string path);
  protected:
    Log(std::string path) : path(path), log(path) {};
    std::string path;
    std::ostream log;
  private:
    static std::map<std::string, Log*> instances;
};

std::map<std::string, Log*> Log::instances = std::map<std::string, Log*>();

Log* Log::get_instance(std::string path) …
Run Code Online (Sandbox Code Playgroud)

c++ big-o time-complexity c++11

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