C++ 14 常用新特性

C++14 新特性

目录

C++14 新特性

lambda 初始化捕获

Abstract

Demo

废弃标志[[deprecated]]

Abstract

Demo

读写锁std::shared_timed_mutex和std::shared_lock

Abstract

Demo

模板可变整数序列

Abstract

Demo

改变exchange

Abstract

Demo

字符串带引号

Abstract


lambda 初始化捕获

Abstract

可以对捕获列表的捕获变量“赋值”,C++14中的这个新特性允许了在捕获列表中定义前面没有出现过的变量,但必须赋予一个值,并且不使用类型说明符和auto,类型由编译器自动推断。

Demo

#include <cmath>
#include <iostream>
using namespace std;

int main() {
  int a = 2;
  [a = sin(a)]() {
    cout << a << endl;		// 0.909297
    cout << cos(a) << endl;	// 0.6143
  }();

  cout << a << endl;		// 2
  cout << cos(a) << endl;	// -0.416147
  return 0;
}


废弃标志[[deprecated]]

Abstract

C++14中增加了[[deprecated]]标记,可以修饰类、函数、变量等,当程序中使用了被其修饰的模块时,编译器会产生告警,提示用户该标记标记的内容将来可能会被废弃,尽量不要使用。

Demo

struct [[deprecated]] Tmp {};

读写锁std::shared_timed_mutex和std::shared_lock

Abstract

C++14中通过std::shared_timed_mutex和std::shared_lock实现读写锁,保证多个线程可以同时读,但是写线程必须独立运行,写操作不能和读操作同时进行。

Demo

struct ThreadSafe {
  mutable std::shared_timed_mutex _mutex;
  int _value;

  ThreadSafe() { _value = 0; }

  int get() const {
    std::shared_lock<std::shared_timed_mutex> loc(_mutex);
    return _value;
  }

  void increase() {
    std::unique_lock<std::shared_timed_mutex> lock(_mutex);
    _value += 1;
  }
};

模板可变整数序列

Abstract

类模板 std::integer_sequence 表示一个编译时的整数序列。在用作函数模板的实参时,能推导参数包 Ints 并将它用于包展开。

Demo

#include <array>
#include <iostream>
#include <tuple>
#include <utility>

template <typename T, T... ints>
void print_sequence(std::integer_sequence<T, ints...> int_seq) {
  std::cout << "The sequence of size " << int_seq.size() << ": ";
  ((std::cout << ints << ' '), ...);
  std::cout << '\n';
}

// 转换数组为 tuple
template <typename Array, std::size_t... I>
auto a2t_impl(const Array &a, std::index_sequence<I...>) {
  return std::make_tuple(a[I]...);
}

template <typename T, std::size_t N, typename Indices = std::make_index_sequence<N>>
auto a2t(const std::array<T, N> &a) {
  return a2t_impl(a, Indices{});
}

// 漂亮地打印 tuple

template <class Ch, class Tr, class Tuple, std::size_t... Is>
void print_tuple_impl(std::basic_ostream<Ch, Tr> &os, const Tuple &t, std::index_sequence<Is...>) {
  ((os << (Is == 0 ? "" : ", ") << std::get<Is>(t)), ...);
}

template <class Ch, class Tr, class... Args>
auto &operator<<(std::basic_ostream<Ch, Tr> &os, const std::tuple<Args...> &t) {
  os << "(";
  print_tuple_impl(os, t, std::index_sequence_for<Args...>{});
  return os << ")";
}

int main() {
  print_sequence(std::integer_sequence<unsigned, 9, 2, 5, 1, 9, 1, 6>{});
  print_sequence(std::make_integer_sequence<int, 20>{});
  print_sequence(std::make_index_sequence<10>{});
  print_sequence(std::index_sequence_for<float, std::iostream, char>{});

  std::array<int, 4> array = {1, 2, 3, 4};

  // 转换 array 为 tuple
  auto tuple = a2t(array);
  static_assert(std::is_same<decltype(tuple), std::tuple<int, int, int, int>>::value, "");

  // 打印到 cout
  std::cout << tuple << '\n';
}

改变exchange

Abstract

相对于swap不对后者赋值

Demo

#include <iostream>
#include <utility>
#include <vector>

using namespace std;

int main() {
  vector<int> vec1{1, 2, 3, 4};
  vector<int> vec2{5, 6, 7, 8};

  cout << "exchange before: " << endl;
  cout << "vec1: " << endl;
  copy(vec1.begin(), vec1.end(), ostream_iterator<int>{cout, " "});
  cout << endl << "vec2: " << endl;
  copy(vec2.begin(), vec2.end(), ostream_iterator<int>{cout, " "});

  exchange(vec1, vec2);

  cout << endl << "exchange after: " << endl;
  cout << "vec1: " << endl;
  copy(vec1.begin(), vec1.end(), ostream_iterator<int>{cout, " "});
  cout << endl << "vec2: " << endl;
  copy(vec2.begin(), vec2.end(), ostream_iterator<int>{cout, " "});

  return 0;
}

字符串带引号

Abstract

#include <iomanip>
#include <iostream>
#include <string>

int main() {
  std::string str{"hello world"};
  std::cout << str << std::endl;				// hello world
  std::cout << std::quoted(str) << std::endl;	// "hello world"

  return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: C 11 特性是指 C 语言的第 11 版本(也称为 C11),它引入了一些的功能和改进,以提高 C 语言的使用性和性能。 首先,C 11 特性中引入了线程支持。C 语言之前的版本没有原生的线程支持,但在 C11 中引入了线程库,使得开发者可以使用线程来并发执行不同的任务,从而提高程序的效率。 其次,C 11 特性中还引入了原子操作。原子操作是指一种无法被中断的操作,它可以保证在多线程环境下的数据一致性和同步。C 11 提供了一些原子操作的函数和类型,使得开发者能够更方便地处理多线程编程中的共享数据和临界区问题。 此外,C 11 还引入了泛型选择表达式(Generic Selection Expression)。泛型选择表达式允许在编译时根据不同的类型执行不同的操作,这样可以提高代码的复用性和灵活性。开发者可以根据需要定义不同的操作和类型,然后在程序中使用泛型选择表达式来选择合适的操作。 最后,C 11 特性还包括对 C 语言标准库的一些改进和增强。例如,C 11 引入了一些的数学库函数、字符串处理函数、输入输出函数等,使得开发者能够更方便地进行数值计算、字符串处理和文件读写等操作。 综上所述,C 11 特性为开发者提供了更强大和便捷的工具,使得 C 语言在并发编程、数据处理和算法实现方面具有更高的性能和灵活性。 ### 回答2: C 11中的特性主要包括对C语言的增强和扩展,其中也包括了对PDF的支持。 首先,C 11对语言本身进行了改进。它提供了更丰富的数据类型支持,包括_Bool、_Imaginary和_Complex等的数据类型,使得程序员能够更方便地处理复杂的数据。此外,C 11还引入了泛型选择表达式(Generic Selection Expression),使得代码能够更加灵活和通用。 其次,C 11还引入了对多线程编程的支持。它提供了线程库和原子操作函数,使得并发编程更加容易,能够充分利用多核处理器的计算能力,提高程序的性能。这对于需要处理大规模数据和实时计算的应用来说非重要。 另外,C 11还加入了对PDF的支持。PDF(Portable Document Format)是一种用的文档格式,C 11通过引入一些的函数和数据类型,使得程序可以更方便地处理PDF文件。例如,C 11提供了一些用于读写PDF文件的函数接口,使得程序能够直接读取和修改PDF文件中的内容,实现对PDF文件的灵活处理。 总之,C 11的特性不仅增强了C语言本身的功能和性能,还为开发者提供了更多的选择和便利,包括更丰富的数据类型支持、多线程编程和对PDF的处理。这些特性使得C 11成为一个更强大和适用的编程语言,在许多应用领域中得到了广泛的应用和推广。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ym影子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值