Questions tagged «c++14»

C ++ 14是2014年批准的C ++标准的名称。它以以前的C ++ 11标准为基础,改进了核心语言和标准库并添加了一些功能。

2
如何在现代C ++中实现经典的排序算法?
在大多数实现中,C ++标准库中的std::sort算法(及其表亲std::partial_sort和std::nth_element)是更多基本排序算法(例如选择排序,插入排序,快速排序,合并排序或堆排序)的复杂混合混合。 在这里以及在姐妹网站(例如https://codereview.stackexchange.com/)上,存在许多与这些经典排序算法的错误,复杂性和实现的其他方面有关的问题。提供的大多数实现都是由原始循环,使用索引操作和具体类型组成的,并且从正确性和效率方面来说,通常都是不平凡的分析。 问题:如何使用现代C ++实现上述经典排序算法? 没有原始循环,但结合了标准库的算法构建块<algorithm> 迭代器接口和模板的使用,而不是索引操作和具体类型的使用 C ++ 14样式,包括完整的标准库以及语法降噪器,例如auto,模板别名,透明比较器和多态lambda。 注意事项: 有关排序算法实现的更多参考,请参见Wikipedia,Rosetta Code或http://www.sorting-algorithms.com/ 根据Sean Parent的约定(幻灯片39),原始循环是-循环,for比使用运算符将​​两个函数组成更长。So f(g(x));or f(x); g(x);or f(x) + g(x);不是原始循环,也不是内部selection_sort和insertion_sort下面的循环。 我遵循Scott Meyers的术语将当前的C ++ 1y表示为C ++ 14,并将C ++ 98和C ++ 03都表示为C ++ 98,所以不要为此而烦恼。 正如@Mehrdad的评论中所建议的那样,我在答案的末尾提供了四个作为实时示例的实现:C ++ 14,C ++ 11,C ++ 98和Boost和C ++ 98。 答案本身仅用C ++ 14表示。在相关的地方,我表示的是各种语言版本不同的语法和库差异。

2
现代C ++可以免费为您提供性能吗?
有时有人声称C ++ 11/14可以提高性能,即使仅编译C ++ 98代码也可以。理由通常是根据移动语义的,因为在某些情况下,右值构造函数是自动生成的,或者现在是STL的一部分。现在,我想知道以前是否已经通过RVO或类似的编译器优化处理了这些情况。 然后我的问题是,是否可以给我一个C ++ 98代码的实际示例,该示例无需修改即可使用支持新语言功能的编译器更快地运行。我确实理解不需要标准兼容的编译器来执行复制省略,仅由于这个原因,移动语义可能会带来速度,但是如果您愿意,我希望看到一种病态较少的情况。 编辑:为了清楚起见,我不是在问新的编译器是否比旧的编译器快,而是如果有代码将-std = c ++ 14添加到我的编译器标志中,它将运行得更快(避免复制,但是如果您除了移动语义之外,还可以提出其他建议,我也很感兴趣)

6
C ++ 11、14、17或20是否为pi引入标准常数?
在C和C ++中,数字pi存在一个相当愚蠢的问题。我所知道的M_PImath.h,任何标准都不要求定义。 新的C ++标准在标准库中引入了许多复杂的数学运算-双曲函数std::hermite和std::cyl_bessel_i,不同的随机数生成器等。 是否有任何“新”标准为pi引入常数?如果没有-为什么?没有它,所有这些复杂的数学如何工作? 我知道有关C ++中pi的类似问题(它们已有好几年历史了,并且已经成为标准)。我想知道问题的当前状态。 我也对为什么 C ++仍然没有pi常量但具有很多更复杂的数学的原因非常感兴趣。 UPD:我知道我可以将pi定义为4 * atan(1)或acos(1)或double pi = 3.14。当然。但是为什么在2018年我仍然必须这样做?没有pi的标准数学函数如何工作? UPD2:根据这个在科隆在2019年7月C ++委员会会议之行报告,建议P0631(数学常数)被接纳进入C ++ 20。这样看来,终于在标准库中有了数字pi了!

8
Lambda捕获作为const参考吗?
是否可以通过const引用在Lambda表达式中捕获? 我希望下面标记的作业失败,例如: #include <cstdlib> #include <vector> #include <string> #include <algorithm> using namespace std; int main() { string strings[] = { "hello", "world" }; static const size_t num_strings = sizeof(strings)/sizeof(strings[0]); string best_string = "foo"; for_each( &strings[0], &strings[num_strings], [&best_string](const string& s) { best_string = s; // this should fail } ); return …
166 c++  c++11  lambda  c++14 

2
decltype(auto)有什么用?
Наэтотвопросестьответына 堆栈溢出нарусском:Конструкцияdecltype(自动) 在c ++ 14中,decltype(auto)引入了惯用语。 通常,它的用途是允许auto声明使用decltype给定表达式上的规则。 在搜索“良好”使用该用法的示例时,我只能想到以下内容(由Scott Meyers撰写),即函数的返回类型推导: template<typename ContainerType, typename IndexType> // C++14 decltype(auto) grab(ContainerType&& container, IndexType&& index) { authenticateUser(); return std::forward<ContainerType>(container)[std::forward<IndexType>(index)]; } 还有其他使用此新语言功能的示例吗?

2
void_t如何工作
我观看了Walter Brown在Cppcon14上有关现代模板编程的演讲(第一部分,第二部分),他介绍了他的void_tSFINAE技术。 示例: 给定一个简单的变量模板,该模板评估void所有模板参数是否格式正确: template< class ... > using void_t = void; 以及以下特征来检查是否存在称为member的成员变量: template< class , class = void > struct has_member : std::false_type { }; // specialized as has_member< T , void > or discarded (sfinae) template< class T > struct has_member< T , void_t< decltype( T::member ) > …
148 c++  templates  c++14  sfinae 

7
什么时候应该使用C ++ 14自动返回类型推导?
随着GCC 4.8.0的发布,我们有了一个支持自动返回类型推导的编译器,它是C ++ 14的一部分。使用-std=c++1y,我可以这样做: auto foo() { //deduced to be int return 5; } 我的问题是:什么时候应该使用此功能?什么时候需要,什么时候可以使代码更简洁? 场景1 我能想到的第一种情况是尽可能的。可以用这种方式编写的每个函数都应该如此。这样做的问题是,它可能并不总是使代码更具可读性。 方案2 下一种情况是避免使用更复杂的返回类型。作为一个非常简单的示例: template<typename T, typename U> auto add(T t, U u) { //almost deduced as decltype(t + u): decltype(auto) would return t + u; } 尽管在某些情况下让返回类型显式依赖于参数,但我认为这绝对不会成为问题。 场景3 接下来,为了防止冗余: auto foo() { std::vector<std::map<std::pair<int, double>, …

2
#pragma是否曾经是C ++ 11标准的一部分?
传统上,避免C ++中包含多个标头的标准且可移植的方法是使用#ifndef - #define - #endif预编译器指令方案,该方案也称为宏保护方案(请参见下面的代码段)。 #ifndef MY_HEADER_HPP #define MY_HEADER_HPP ... #endif 但是,在大多数实现/编译器中(请参见下图),还有一个更“优雅”的替代方案,其作用与称为的宏保护方案相同#pragma once。#pragma once与宏保护方案相比,它具有多个优点,包括更少的代码,避免名称冲突以及有时提高了编译速度。 经过研究,我意识到尽管#pragma once几乎所有已知的编译器都支持伪指令,但是伪#pragma once指令是否属于C ++ 11标准还是有一定的困惑。 问题: 有人可以澄清#pragma once指令是否属于C ++ 11标准吗? 如果它不是C ++ 11标准的一部分,是否有任何计划将其包含在更高版本中(例如C ++ 14或更高版本)? 如果有人可以进一步详细说明使用这两种技术中的任何一种(例如,宏观卫士与#pragma once)的优势/劣势,那也很好。

1
在std :: vector :: erase()和std :: deque :: erase()中复制/移动分配
在回答的过程中的另一个问题,我偶然发现稍有不同的措辞为std::vector::erase()和std::deque::erase()。 这就是C ++ 14关于std::deque::erase([deque.modifiers]/4-6,重点是我的)的看法: 效果: ... 复杂性:析构函数的调用数与擦除的元素数相同,但是对赋值运算符的调用数不超过擦除的元素之前的元素数量和删除元素之后的元素数量中的较小者。擦除的元素。 抛出:除非的复制构造函数,move构造函数,赋值运算符或move赋值运算符抛出异常,否则什么都不会发生T。 它是关于std::vector::erase([vector.modifiers]/3-5)的内容: 效果: ... 复杂性:的析构函数的T调用次数等于擦除的元素数,但是的移动分配运算符的T调用次数等于在擦除的元素之后向量中的元素数。 抛出:除非的复制构造函数,move构造函数,赋值运算符或move赋值运算符抛出异常,否则什么都不会发生T。 如您所见,它们的异常规范是相同的,但是std::vector明确提到了调用移动赋值运算符。 还有的要求T是MoveAssignable对erase()与这两个工作std::vector和std::deque(表100),但这并不意味着移动赋值运算符的存在:一个可以定义一个拷贝赋值运算符,而不是定义移动赋值操作符,而这个班会是MoveAssignable。 为了以防万一,我检查了GCC和Clang,并确实std::vector::erase()在没有移动分配运算符的情况下调用了复制分配运算符,并且std::deque::erase()执行了同样的操作(DEMO)。 所以问题是:我错过了什么吗,或者这是标准中的(编辑)问题? 更新: 我已经提交了LWG问题#2477。


3
通用Lambda在C ++ 14中如何工作?
通用Lambda如何auto在C ++ 14标准中工作(关键字作为参数类型)? 它是否基于C ++模板,其中每个不同的参数类型,编译器都会生成具有相同主体但被替换类型的新函数(编译时多态性)?或者它更类似于Java的泛型(类型擦除)? 代码示例: auto glambda = [](auto a) { return a; };
114 c++  lambda  auto  c++14 

13
如何使用C ++避免内部带有“ if”条件的“ for”循环?
用我编写的几乎所有代码,我经常要处理集合的集合约简问题,这些集合最终会在集合内部出现幼稚的“ if”条件。这是一个简单的例子: for(int i=0; i<myCollection.size(); i++) { if (myCollection[i] == SOMETHING) { DoStuff(); } } 使用函数式语言,我可以通过轻松地将集合简化为另一个集合来解决问题,然后对我的简化集合执行所有操作。用伪代码: newCollection <- myCollection where <x=true map DoStuff newCollection 在其他C变体中,例如C#,我可以使用where子句来简化 foreach (var x in myCollection.Where(c=> c == SOMETHING)) { DoStuff(); } 或者更好(至少在我看来) myCollection.Where(c=>c == Something).ToList().ForEach(d=> DoStuff(d)); 诚然,我正在做很多范式混合和基于主观/观点的风格,但是我不禁感到缺少真正的基础知识,可以让我将这种首选技术与C ++一起使用。有人可以启发我吗?
111 c++  c++11  c++14 

4
什么是透明比较器?
在C ++ 14中,关联容器似乎已从C ++ 11进行了更改– [associative.reqmts] / 13说: 成员函数模板find,count,lower_bound,upper_bound,并且equal_range不得,除非类型参与重载决议Compare::is_transparent存在。 使比较器“透明”的目的是什么? C ++ 14还提供了如下库模板: template <class T = void> struct less { constexpr bool operator()(const T& x, const T& y) const; typedef T first_argument_type; typedef T second_argument_type; typedef bool result_type; }; template <> struct less<void> { template <class T, class U> …
106 c++  c++14  c++-faq 

3
C ++ 14是否在C ++中添加了新关键字?
C ++标准委员会倾向于回避向该语言添加新的关键字,但是对于C ++ 11而言并非如此。一些例子: constexpr decltype thread_local auto // New usage noexcept nullptr static_assert alignof alignas C ++ 14引入了新的关键字吗?
103 c++  c++11  keyword  c++14 


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.