标签: std

C++ Long switch语句还是用map查找?

在我的C++应用程序中,我有一些值作为代码来表示其他值.要翻译代码,我一直在讨论使用switch语句或stl映射.开关看起来像这样:

int code;
int value;
switch(code)
{
case 1:
    value = 10;
    break;
case 2:
    value = 15;
    break;
}
Run Code Online (Sandbox Code Playgroud)

地图将是一个,stl::map<int, int>并且翻译将是一个简单的查找,其中代码用作键值.

哪一个更好/更有效/更清洁/接受?为什么?

c++ dictionary stdmap std switch-statement

30
推荐指数
3
解决办法
6023
查看次数

std :: mem_fun vs std :: mem_fn

std::mem_fun和之间有什么区别std::mem_fn?为什么命名如此令人困惑?

Boost的文档说在大多数情况下std::mem_fn都可以替代std::mem_fun.那你在什么情况下仍会使用std::mem_fun

c++ std member-functions c++11

30
推荐指数
1
解决办法
8601
查看次数

容器固定动态尺寸

是否有一个固定长度序列的标准容器,其长度在运行时确定.我想将参数传递给每个sequence元素的构造函数,并使用该参数初始化const成员(或引用).我还想在O(1)中的给定索引处获得序列元素.在我看来,我的所有要求都无法同时满足.

  • 我知道std::array有固定长度,但必须在编译时知道该长度.
  • std::vector具有动态大小,并允许使用传递构造函数参数emplace.虽然你可以reserve记忆以避免实际的重新分配,但是类型仍然必须是可移动的,理论上允许这样的重新分配,例如防止const成员.
  • 然后有,std::list并且std::forward_list,它不需要可移动类型,但仍然可调整大小并且在随机访问模式下将表现得相当差.我还认为这些列表可能会产生相当大的开销,因为每个列表节点可能会单独分配.
  • 奇怪的是,std::valarray到目前为止,这是我最好的选择,因为它有一个固定的长度,不会自动调整大小.虽然有一种resize方法,但除非您实际调用该方法,否则您的类型不必是可移动的.这里的主要缺点是缺少自定义构造函数参数,因此使用此方法无法初始化const成员.

我错过了一些替代方案吗?有没有办法调整其中一个标准容器,以满足我的所有要求?


编辑:为了让您更准确地了解我正在尝试做什么,请参阅此示例:

class A {
  void foo(unsigned n);
};

class B {
private:
  A* const a;
  const unsigned i;
public:
  B(A* aa) : a(aa), i(0) { }
  B(A* aa, unsigned ii) : a(aa), i(ii) { }
  B(const std::pair<A*, unsigned>& args) : B(args.first, args.second) { }
  B(const B&) = delete;
  B(B&&) = delete;
  B& operator=(const B&) = delete; …
Run Code Online (Sandbox Code Playgroud)

c++ containers std sequence c++11

30
推荐指数
2
解决办法
2246
查看次数

在常量表达式中使用numeric_limits :: max()

我想在类中定义一个常量,该值是最大可能的int.像这样的东西:

class A
{
    ...
    static const int ERROR_VALUE = std::numeric_limits<int>::max();
    ...
}
Run Code Online (Sandbox Code Playgroud)

此声明无法使用以下消息进行编译:

numeric.cpp:8:错误:"的std :: numeric_limits :: MAX()"不能出现在一个常数表达式numeric.cpp:8:错误:一个函数调用不能出现在一个常数表达式

我理解为什么这不起作用,但有两件事对我来说很奇怪:

  1. 在我看来,在常量表达式中使用该值是一个自然的决定.为什么语言设计者决定使max()成为一个函数,从而不允许这种用法?

  2. 该规范在18.2.1中声称

    对于在numeric_limits模板中声明为static const的所有成员,特化应以这样的方式定义这些值,使它们可用作整型常量表达式.

    这不是说我应该能够在我的场景中使用它而不是它与错误信息相矛盾吗?

谢谢.

c++ std numeric-limits constexpr

29
推荐指数
3
解决办法
9482
查看次数

在地图中存储标准地图

我必须将std :: map存储为std :: map中的值

std::map< std::string, std::map<std::string, std::string> > someStorage;
Run Code Online (Sandbox Code Playgroud)

如何插入第二个(内部)地图?我尝试过:

someStorage.insert( std::make_pair("key", std::make_pair("key2", "value2")) );
Run Code Online (Sandbox Code Playgroud)

但这会引发很多错误.怎么了?

c++ insert std map

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

我想用它的线程对象杀死一个std :: thread?

可能重复:
C++ 0x线程中断

我试图通过使用其线程对象来杀死/停止c ++ std :: thread.

我们应该怎么做?

c++ multithreading std c++11 stdthread

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

浮点数的二元相等比较是否正确?

我正在研究不同的内存块操作函数,在基准测试中我注意到,我的实现IsEqualRange(double* begin1, double* end1, double* begin2, double* end2)速度比std::equals(...)MSVC和GCC 快得多.进一步的调查表明,双打和浮标不是比较的memcmp,而是一个接一个的for循环.

在哪种情况下,浮点数的二进制比较会导致错误的结果?什么时候可以二进制比较(相等)浮点数/双打数组?我不应该使用其他基本类型memcmp吗?

c++ floating-point std

29
推荐指数
2
解决办法
2693
查看次数

为什么 std::hash 不能保证是确定性的?

此后,我们使用N4140(C++14 标准)。


根据§ 17.6.3.4 哈希要求

返回值应仅取决于k 程序持续时间的参数。

[注意:因此,对于给定的程序执行,h(k)具有相同值 的表达式的所有评估都会k产生相同的结果。— 尾注 ]

§ 20.9.12 类模板哈希

...

实例化hash<Key>应:

(1.1) — 满足哈希要求 (17.6.3.4) ...

(1.2) — ...


这意味着如果您重新启动程序,value(ie hash<decltype(value)>(value))的哈希值可能会采用不同的值。

但为什么?这个限制不在 C++11 的标准中,而是在 C++14、C++17 和 C++20 的标准中。作为用户(不是 STL 开发人员),如果std::hash是确定性的,那将非常有用。在实现确定性散列函数时有什么数学上的困难吗?但是我们日常使用的散列函数(例如已弃用md5sum或更安全sha256)都是确定性的。效率有问题吗?

c++ hash std language-lawyer

28
推荐指数
2
解决办法
1330
查看次数

如何在成员函数上使用std :: async?

如何在成员函数上运行std :: async调用?

例:

class Person{
public:
    void sum(int i){
        cout << i << endl;
    }
};

int main(int argc, char **argv) {
    Person person;
    async(&Person::sum,&person,4);
}
Run Code Online (Sandbox Code Playgroud)

我想调用sum async.

Person p;
call async to p.sum(xxx)
Run Code Online (Sandbox Code Playgroud)

我没弄明白我是否能用std :: async做到这一点.不想使用提升.寻找一线异步呼叫方式.

c++ multithreading std c++11

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

我怎样才能让gcc警告我"int i = i;"

一个简单的程序:

int main()
{
    long i = i;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译为C不会出现错误,也不会出现警告.

$ gcc -Wall -Wextra -pedantic 1.c
Run Code Online (Sandbox Code Playgroud)

编译为C++会发出警告:

$ c++ -Wall -Wextra -pedantic 1.c
1.c: In function ‘int main()’:
1.c:3:7: warning: ‘i’ is used uninitialized in this function [-Wuninitialized]
  long i = i;
Run Code Online (Sandbox Code Playgroud)

在两种情况下,变量i似乎都是0,尽管在c ++中它可能是未初始化的.我实际上在我的一个功能中犯了这样的错字,很难找到它.我该怎么做才能避免这种情况?我希望至少有一个警告.此外,Clang在任何一种情况下都不会给出任何警告(c或c ++).是否有标准的特定部分说明了这种行为?

编辑:尝试了类似的东西:

$ cat 1.c
int main(void)
{
    int k = k + 0;
    int i = i + 1;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

警告(在C中)仅针对"i"生成.

$ gcc -Wall -Wextra 1.c
1.c: In function ‘main’:
1.c:4:6: …
Run Code Online (Sandbox Code Playgroud)

c c++ gcc std compiler-warnings

27
推荐指数
1
解决办法
853
查看次数