C++ 14 auto

C++14标准最近刚被通过,像以前一样,没有给这个语言带来太大变化,C++14标准是想通过改进C++11 来让程序员更加轻松的编程,C++11引入auto关键字(严格来说auto从C++ 03 开始就有了,只是C++11改变了auto的含义),auto让你的代码更加干净,更容易让你避免错误,举个例子

原来你必须这样写


1

2

int i = 1;

   std::complex<double> c = return_a_complex_number();

你现在可以这样写


1

2

auto i = 1;

   auto c = return_a_complex_number();

声明为auto的变量在编译时期就分配了内存,而不是到了运行时期,所以使用auto不再引发任何速度延迟,这也意味着使用auto的时候,这个变量不初始化会报错。因为编译器无法知道这个变量的类型。


1

auto i;     // this will rise a compilation error

C++11中一个做的不好的地方是,你不能使用auto来定义一个函数类型,在新的标准中你就可以了:


1

2

3

4

5

// Error in C++11, works in C++14

  auto my_function() {

      ...

      return value;

  }

只要你的函数返回一个值,编译器就知道怎么解释这个auto关键词。现在,你可以使用最新版本的Clang和GCC,


1

g++-4.9.1 -Wall -std=c++14 -pedantic my_prog_name.cpp -o my_prog_name

为了更好地使用auto来简化你的代码,让我们分别使用C++98 、C++11 和C++14 来实现同一段代码,为了说明,我们使用两个函数来改变一个vector变量


1

multiply_by_two(add_one(my_vector));

很明显,这个循环给一个vector变量的每一个值加一再乘以二 你可以写一个函数,而不是两个。这里我们不是为了追求性能,而是说明auto的用法。

在C++98中你要这样写

std::vector<int>& add_one(std::vector<int> &v) {
        for(std::vector<int>::iterator it = v.begin(); it != v.end(); it++) {
            *it += 1;
        }
        return v;
    }

    void multiply_by_two(std::vector<int> &v) {
        for(std::vector<int>::iterator it = v.begin(); it != v.end(); it++) {
            *it *= 2;
        }
    }

上面的代码显得很啰嗦

在C++11中你可以这样写


1

2

3

4

5

6

7

8

9

10

11

12

std::vector<int>& add_one(std::vector<int> &v) {

        for(auto& it : v) {

            it += 1;

        }

        return v;

    }

    void multiply_by_two(std::vector<int> &v) {

        for(auto& it : v) {

            it *= 2;

        }   

    }

C++11 中显然有了进步,我们这是可以使用auto来简化循环时候的一点代码。但仍显啰嗦。

在C++14中你可以使用auto来定义一个函数类型,代码可以简化为这样:


1

2

3

4

5

6

7

8

9

10

11

12

auto& add_one(std::vector<int>& v) {

      for(auto& it : v) {

          it += 1;

      }

      return v;

  }

  void multiply_by_two(std::vector<int>& v) {

      for(auto& it : v) {

          it *= 2;

      }   

  }

这里是完整代码


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

// C++14 "auto" demo code   

 #include <iostream>

 #include <vector>

 auto& add_one(std::vector<int>& v) {

     for(auto& it : v) {

         it += 1;

     }

     return v;

 }

 void multiply_by_two(std::vector<int>& v) {

     for(auto& it : v) {

         it *= 2;

     }   

 }

 void print_vec(const std::vector<int>& v) {

     for(const auto& e: v) {

         std::cout << e << std::endl;

     }  

     std::cout << std::endl;    

 }

 int main() {

     // Add one and multiply by two a vector of integers

     std::vector<int> my_vector{-1, 2, 3, 5};

     multiply_by_two(add_one(my_vector));   

     print_vec(my_vector);

     return 0;

 }

你可以清晰的对比出,C++14比C++11 有了一点进步。

时间: 2024-07-29 20:30:09

C++ 14 auto的相关文章

深谈auto变量

1.c++中有一个关键字auto,c语言也有这么一个关键字,但是两者的意义大不相同. 2.c++中用auto定义的变量自动匹配赋值号右边的值的类型,具有自动匹配类型的作用,而c语言中auto只是声明一个变量为自动类型,说明这个变量的代码块生存期和分配在栈上,并且不能用来定义变量. 3.c++中auto可以起到泛型的作用,你不管给我传什么类型,我都可以识别,而且按类型使用这个变量. 4.下面看cpp测试代码 1 #include <iostream> 2 3 using namespace st

《C++ Primer》学习 之 编译器推断auto类型

/* <C++ Primer>学习 之 编译器推断auto类型 书P61-P62 重点在于程序中的注释,方便以后复习. */ 1 #include <iostream> 2 #include <cmath> 3 #include <string> 4 using namespace std; 5 6 int main() 7 { 8 int i = 0, &r = i; 9 auto a = r; // a : int 10 11 const int

auto关键字

auto关键字:1.C++98标准auto关键字的作用和C语言的相同,表示自动变量,是关于变量存储位置的类型饰词,通常不写,因为局部变量的默认存储就是auto 1 void foo(void) 2 { 3 int a; //变量存储在栈区 4 auto int b; //自动变量,存储在栈区 5 static int c; //静态变量,存储在数据区 6 register int d;//寄存器变量,存储在寄存器中 7 } 2.C++11标准中auto关键字不再表示变量的存储类型,而是用于类型推

C++11 AUTO 类型实践

auto在C++11中引入,为大家带来方便. 具体使用及注意事项参考: https://blog.csdn.net/xiaoquantouer/article/details/51647865 https://www.cnblogs.com/lenmom/p/7988635.html 用法: 一是在变量声明时根据初始化表达式自动推断该变量的类型.适用于类型冗长复杂,模板类型等 二是在声明函数时作为函数返回值的占位符 注意事项: 1.使用auto关键字的变量必须有初始值.类似引用 2.函数参数和模

类型别名,auto,decltype

1.类型别名 类型别名是某种类型的同义词. 1 int main() 2 { 3 typedef char *ps; // ps是类型char*的别名 4 const ps p1 = 0; // p1是指向char的常量指针 5 const ps *p2; // p2是一个指针,它的对象是指向char的常量指针 6 return 0; 7 } 注意:遇到使用了类型别名的声明语句时,人们往往会错误地尝试把类型别名替换成它本来的样子去理解,这种理解方法是错误的:要将类型别名看成是一个基本数据类型去理

AutoCompleteTextView自动完成输入内容的控件

一.如果我们想实现用户输入的内容有自动提示的功能,类似百度的搜索结果, AutoCompleteTextView可以实现. 二.下面就是 AutoCompleteTextView实例: 在main.xml文件中: 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android

windows开发cocos2d-x系列(2)—简单解析HelloWorld

前言 上一篇介绍了cocos2d的环境搭建,今天我们来一起运行,编写,以及解析cocos2d-x 3.0的HelloWorld.程序虽小,五脏俱全. 创建一个HelloWorld 我们开始自己创建HelloWorld吧.首先打开windows的cmd窗口,然后在cmd中输入以下命令: cocos new HelloWorld -p com.momo.helloWorld -l cpp -d projects HelloWorld就是项目名称,-p后面接着的就是项目的包名,-l后面指定语言版本,-

详解map、multimap、unordered_map、unordered_multimap

详解map.multimap.unordered_map.unordered_multimap 相信有不少同学和我一样刚接触C++ STL,被其深深吸引.但是想弄懂每个模板类不是一个容易事.大家应该对vector.list.stack.queue等类比较了解了,所以今天详细介绍下几个很常用很强大但有点不太好懂的类map.multimap.unordered_map.unordered_multimap.乍一看都差不多都是什么map,但这肯定有所不同.下面就在一个一个讲解的同时,让大家了解这四个类

C++primer 9.2.7节练习

练习9.15 1 #include <iostream> 2 #include <vector> 3 #include <list> 4 #include <iterator> 5 6 using namespace std; 7 8 int main() 9 { 10 vector<int> v1{ 1, 3, 5, 7, 9 }; 11 vector<int> v2{ 1,3,9 }; 12 vector<int> v