小编Tem*_*Rex的帖子

什么时候应该在C++ 11中使用constexpr功能?

在我看来,拥有"总是返回5的功能"正在破坏或淡化"调用函数"的含义.必须有一个原因,或者需要这种能力,或者它不会出现在C++ 11中.为什么会这样?

// preprocessor.
#define MEANING_OF_LIFE 42

// constants:
const int MeaningOfLife = 42;

// constexpr-function:
constexpr int MeaningOfLife () { return 42; }
Run Code Online (Sandbox Code Playgroud)

在我看来,如果我编写了一个返回字面值的函数,并且我进行了代码审查,有人会告诉我,我应该声明一个常量值而不是写回返5.

c++ constexpr c++11

322
推荐指数
9
解决办法
11万
查看次数

如何在现代C++中实现经典排序算法?

std::sort算法(及其同类std::partial_sortstd::nth_element从C++标准库)是在大多数实现的更基本的排序算法复杂和混合合并,如选择排序,插入排序,快速排序,归并排序,或堆排序.

这里和姐妹网站上有很多问题,例如https://codereview.stackexchange.com/,与错误,复杂性以及这些经典排序算法的实现的其他方面有关.大多数提供的实现包括原始循环,使用索引操作和具体类型,并且在正确性和效率方面分析通常是非常重要的.

:如何使用现代C++实现上述经典排序算法?

  • 没有原始循环,但结合了标准库的算法构建块<algorithm>
  • 迭代器接口模板的使用,而不是索引操作和具体类型
  • C++ 14风格,包括完整的标准库,以及语法降噪器,如auto模板别名,透明比较器和多态lambda.

备注:

  • 有关排序算法实现的进一步参考,请参阅Wikipedia,Rosetta Codehttp://www.sorting-algorithms.com/
  • 根据Sean Parent的惯例(幻灯片39),原始循环for比使用运算符的两个函数的组合更长.所以f(g(x));f(x); g(x);f(x) + g(x);不生循环,也不是在环路selection_sortinsertion_sort下方.
  • 我遵循Scott Meyers的术语来表示当前的C++ 1y已经作为C++ 14,并且将C++ 98和C++ 03都表示为C++ 98,所以不要因此而激怒我.
  • 正如@Mehrdad的评论中所建议的那样,我在答案的最后提供了四个实现作为实例:C++ 14,C++ 11,C++ 98和Boost and C++ 98.
  • 答案本身仅以C++ 14的形式呈现.在相关的地方,我表示各种语言版本不同的语法和库差异.

c++ sorting algorithm c++-faq c++14

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

cbegin/cend背后的原因是什么?

我想知道为什么cbegincend在C++ 11中引入?

什么情况下使用这些方法时,使得从常量重载的差异beginend

c++ iterator const-correctness const-iterator c++11

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

对于默认构造函数和析构函数,"= default"与"{}"有什么不同?

我最初发布这个只是关于析构函数的问题,但现在我正在添加对默认构造函数的考虑.这是原始问题:

如果我想给我的类一个虚拟的析构函数,但是与编译器生成的析构函数相同,我可以使用 =default:

class Widget {
public:
   virtual ~Widget() = default;
};
Run Code Online (Sandbox Code Playgroud)

但似乎我可以通过使用空定义减少输入来获得相同的效果:

class Widget {
public:
   virtual ~Widget() {}
};
Run Code Online (Sandbox Code Playgroud)

这两种定义的行为方式有何不同?

根据此问题的回复,默认构造函数的情况似乎相似.鉴于析构函数的" =default"和" {}"之间的含义几乎没有差异,默认构造函数的这些选项之间的含义几乎没有差别吗?也就是说,假设我想创建一个类型,其中该类型的对象将被创建和销毁,为什么我要说

Widget() = default;
Run Code Online (Sandbox Code Playgroud)

代替

Widget() {}
Run Code Online (Sandbox Code Playgroud)

如果在原始帖子违反某些SO规则后延长此问题,我深表歉意.为默认构造函数发布一个几乎完全相同的问题让我觉得不太理想.

c++ user-defined-functions default-constructor deleted-functions c++11

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

我应该更喜欢会员数据中的指针或引用吗?

这是一个简化的例子来说明这个问题:

class A {};

class B
{
    B(A& a) : a(a) {}
    A& a;
};

class C
{
    C() : b(a) {} 
    A a;
    B b; 
};
Run Code Online (Sandbox Code Playgroud)

因此B负责更新C的一部分.我通过lint运行代码并且它围绕引用成员发出错误:lint#1725.这谈到了对默认副本和分配的关注,这是公平的,但默认的副本和赋值也很糟糕,所以那里没有什么优势.

我总是尽量使用引用,因为裸指针不确定地引入了谁负责删除指针.我更喜欢按值嵌入对象,但如果我需要一个指针,我在拥有指针的类的成员数据中使用auto_ptr,并将对象作为引用传递.

当指针可能为null或可能更改时,我通常只在成员数据中使用指针.有没有其他理由更喜欢指向数据成员的引用?

是否真的可以说包含引用的对象不应该是可赋值的,因为初始化后不应更改引用?

c++ reference class-members

126
推荐指数
6
解决办法
9万
查看次数

从同一个向量push_back元素是否安全?

vector<int> v;
v.push_back(1);
v.push_back(v[0]);
Run Code Online (Sandbox Code Playgroud)

如果第二个push_back导致重新分配,则向量中对第一个整数的引用将不再有效.那么这不安全吗?

vector<int> v;
v.push_back(1);
v.reserve(v.size() + 1);
v.push_back(v[0]);
Run Code Online (Sandbox Code Playgroud)

这样可以安全吗?

c++ reference vector push-back language-lawyer

125
推荐指数
4
解决办法
6025
查看次数

为什么`std :: move`命名为`std :: move`?

C++ 11 std::move(x)函数根本不会移动任何东西.它只是一个转换为r值.为什么这样做?这不是误导吗?

c++ c++-faq rvalue-reference move-semantics c++11

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

标准C++库中有哪些异常类

标准C++库中包含哪些异常类,它们应该用于什么?我知道有一些新的C++ 11异常,但我不确定它们是什么或它们在哪里.

c++ stl exception c++11

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

什么时候额外的括号有效,除了运算符优先级?

C++中的括号用于许多地方:例如,在函数调用和分组表达式中,以覆盖运算符优先级.除了非法的额外括号(例如函数调用参数列表周围)之外,C++的一般但非绝对规则是额外的括号永远不会受到伤害:

5.1主要表达式[expr.prim]

5.1.1一般[expr.prim.general]

6带括号的表达式是一个主表达式,其类型和值与所附表达式的类型和值相同.括号的存在不会影响表达式是否为左值.除非另有说明,否则带括号的表达式可以在与可以使用所包含的表达式的上下文完全相同的上下文中使用,并且具有相同的含义.

问题:在哪些上下文中,额外的括号会改变C++程序的含义,而不是覆盖基本的运算符优先级?

注意:我认为没有括号的指针到成员语法的限制&qualified-id超出了范围,因为它限制了语法而不是允许两个具有不同含义的语法.同样,在预处理程序宏定义中使用括号也可以防止不必要的运算符优先级.

c++ c++-faq parentheses language-lawyer c++11

91
推荐指数
1
解决办法
6630
查看次数

如何在C/C++/Obj-C中编写处理负数的模数(%)运算符

我厌恶的C语言(作为一名数学家)就是这样的

(-1) % 8 // comes out as -1, and not 7

fmodf(-1,8) // fails similarly
Run Code Online (Sandbox Code Playgroud)

什么是最好的解决方案?

C++允许模板和运算符重载的可能性,但这些对我来说都是模糊的.感激地收到了例子.

c c++ operator-overloading modulo c++11

81
推荐指数
5
解决办法
23万
查看次数