C++11新特性——初始化列表 initializer_list
破事水:
由于最近数据结构有个实验报告说是要对字符串进行排序,想偷个懒不想一个一个地赋值,虽然可以用strcpy和传入二级指针的形式直接写,但是这样感觉不美观漂亮。
然后就去膜了一下C++11的新特性——初始化列表,概念就不说了,就讲下这东西具体怎么用吧,就是正常的写一个构造函数,然后把参数改为initializer_list<数据类型> &t
如图所示
。
可以理解为传入的参数数据被放到了一个储存器t中,利用C++11的auto可以直接遍历这个储存器t,然后把遍历到的值给结构体用。这里用的是char 数组而不是int是因为这里有一个问题,如果把initializer_list尖括号里的类型改为char *,则会报错,因为普通的""双引号代表的字符串为实际为const 类型,实际本身为一个指针,指向全局const变量中的地址,因此const char *a="123", *b="123",打印a与b的地址会发现a与b是相同的,早上就是因为这个地方百度了一会儿才明白,另外一个点就是若声明的是info数组,那么显然要用info的实例对象去初始化,因此还要把字符串加上大括号来形成一个个info实例对象
下面是完整代码:
#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define LC(x) (x<<1)
#define RC(x) ((x<<1)+1)
#define MID(x,y) ((x+y)>>1)
#define CLR(arr,val) memset(arr,val,sizeof(arr))
#define FAST_IO ios::sync_with_stdio(false);cin.tie(0);
typedef pair<int, int> pii;
typedef long long LL;
const double PI = acos(-1.0);
struct info
{
char name[20];
info() {}
info(const initializer_list<const char *> t)
{
for (auto &item : t)
strcpy(name, item);
}
}; info one[2] = {{"this is one"}, {"this is two"}};
int main(void)
{
for (auto &it : one)
cout << it.name << endl;
return 0;
}
上面是直接用const指针进行初始化,那如果我已经有了一个字符串的二维数组像这样:char s[maxn][maxn] = {"1", "2", "3", "4"},那如何赋值呢?显然把每一个字符串的首地址的地址传进去即可。
#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define LC(x) (x<<1)
#define RC(x) ((x<<1)+1)
#define MID(x,y) ((x+y)>>1)
#define CLR(arr,val) memset(arr,val,sizeof(arr))
#define FAST_IO ios::sync_with_stdio(false);cin.tie(0);
typedef pair<int, int> pii;
typedef long long LL;
const double PI = acos(-1.0);
const int N = 20;
char s[N][N] = {"this is one", "this is two", "3", "4"};
struct info
{
char name[20];
info() {}
info(const initializer_list<const char *> t)
{
for (auto &item : t)
strcpy(name, item);
}
}; info one[2] = {{s[0]}, {s[1]}};
int main(void)
{
for (auto &it : one)
cout << it.name << endl;
return 0;
}
似乎更多的情况并不是什么用字符串赋值,而是像int、double或者自定义结构体这样的赋值,那如何从初始化列表中一个一个读取并连续地赋值到一维或更高维的数组里呢?这里用到了C++11的另一个特性,auto 类型,这样就可以方便地进入初始化列表中去
以HDU 1005为例,如果这题用矩阵快速幂做,那么可以参考以下代码:
#include <stdio.h>
#include <iostream>
using namespace std;
const int N = 2;
const int MOD = 7;
const int F[3] = {0, 1, 1};
struct Mat
{
int A[N][N];
Mat()
{
for (int i = 0; i < N; ++i)
for (int j = 0; j < N; ++j)
A[i][j] = 0;
}
Mat(initializer_list<int> rhs)
{
auto it = rhs.begin();
for (int i = 0; it != rhs.end(); ++it, ++i)
A[i >> 1][i & 1] = *it;
}
Mat operator*(const Mat &rhs)
{
Mat c;
for (int i = 0; i < N; ++i)
for (int j = 0; j < N; ++j)
for (int k = 0; k < N; ++k)
c.A[i][j] = (c.A[i][j] + A[i][k] * rhs.A[k][j]) % MOD;
return c;
}
friend Mat operator^(Mat a, int b)
{
Mat r;
for (int i = 0; i < N; ++i)
r.A[i][i] = 1;
while (b)
{
if (b & 1)
r = r * a;
a = a * a;
b >>= 1;
}
return r;
}
};
int main(void)
{
int A, B, n;
while (~scanf("%d%d%d", &A, &B, &n) && (A || B || n))
{
Mat left =
{
A, B,
1, 0
};
Mat right =
{
F[2], 0,
F[1], 0
};
if (n <= 2)
printf("%d\n", F[n]);
else
{
left = left ^ (n - 2);
Mat resultMat = left * right;
printf("%d\n", resultMat.A[0][0]);
}
}
return 0;
}
C++11新特性——初始化列表 initializer_list的更多相关文章
- C++11新特性——大括号初始化
C++11之前,C++主要有以下几种初始化方式: //小括号初始化 string str("hello"); //等号初始化 string str="hello" ...
- [转载] C++11新特性
C++11标准发布已有一段时间了, 维基百科上有对C++11新标准的变化和C++11新特性介绍的文章. 我是一名C++程序员,非常想了解一下C++11. 英文版的维基百科看起来非常费劲,而中文版维基百 ...
- C++ 11学习和掌握 ——《深入理解C++ 11:C++11新特性解析和应用》读书笔记(一)
因为偶然的机会,在图书馆看到<深入理解C++ 11:C++11新特性解析和应用>这本书,大致扫下,受益匪浅,就果断借出来,对于其中的部分内容进行详读并亲自编程测试相关代码,也就有了整理写出 ...
- C++11新特性总结 (二)
1. 范围for语句 C++11 引入了一种更为简单的for语句,这种for语句可以很方便的遍历容器或其他序列的所有元素 vector<int> vec = {1,2,3,4,5,6}; ...
- C++11新特性总结 (一)
1. 概述 最近在看C++ Primer5 刚好看到一半,总结一下C++11里面确实加了很多新东西,如果没有任何了解,别说自己写了,看别人写的代码估计都会有些吃力.C++ Primer5是学习C++1 ...
- c++学习书籍推荐《深入理解C++11 C++11新特性解析与应用》下载
百度云及其他网盘下载地址:点我 编辑推荐 <深入理解C++11:C++11新特性解析与应用>编辑推荐:C++标准委员会成员和IBM XL编译器中国开发团队共同撰写,权威性毋庸置疑.系统.深 ...
- C++ 11 新特性
C++11新特性: 1.auto 2.nullptr 3.for 4.lambda表达式 5.override ...
- 在C++98基础上学习C++11新特性
自己一直用的是C++98规范来编程,对于C++11只闻其名却没用过其特性.近期因为工作的需要,需要掌握C++11的一些特性,所以查阅了一些C++11资料.因为自己有C++98的基础,所以从C++98过 ...
- C++11新特性——range for
很多编程语言都有range for语法功能,自C++11起,终于将这个重要功能加入C++标准中.range for语句,可以方便的遍历给定序列中的每个元素并对其执行某种操作. 1.基本语法 for(d ...
随机推荐
- tornado 路由系统----扩展(include)
在Tornado中实现Django分层路由 看了几个 Tornado 的 demo 发现都是一个py搞定所有,这样做做为例子来讲确实很直观,但如果在大型项目中这样做肯定不现实,所以博主考虑如何制定合理 ...
- mysql datatime 设置默认值为CURRENT_TIMESTAMP报错`Invalid default value`
环境: Ubuntu mysql 5.5 解决方法: 升级mysql至5.6 apt-cache search mysql-server sudo apt-add-repository ppa:ond ...
- MySQL的语句执行顺序
MySQL的语句执行顺序 MySQL的语句一共分为11步,如下图所标注的那样,最先执行的总是FROM操作,最后执行的是LIMIT操作.其中每一个操作都会产生一张虚拟的表,这个虚拟的表作为一个处理的输入 ...
- 【转】Android中的事件分发和处理
原文链接:http://www.apkbus.com/home.php?mod=space&uid=705730&do=blog&id=61207 上次跟大家分享了一下自定义V ...
- .NET 委托
委托类型定义 C#编译器处理委托时,先自动产生一个派生自System.MulticastDelegate的密封类.这个类与它的基类System.Delegate一起为委托提供必要的基础设施, ...
- java学习笔记
最近在学习JAVA,算得上入门,因为本身是C#程序员,所以也入门也比较快 先打开说一下环境安装吧 下载地址 http://www.oracle.com/technetwork/java/javase/ ...
- 【XLL 框架库函数】 TempActiveRef/TempActiveRef12
[XLL 框架库函数] TempActiveRef/TempActiveRef12 创建一个包含所有激活工作表引用区域 XLOPER/XLOPER12 LPXLOPER TempActiveRef(B ...
- jdbc连接数据库(mysql,sqlserver,oracle)
package com.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Prepare ...
- SQL 关于apply的两种形式cross apply 和 outer apply(转)
转载链接:http://www.cnblogs.com/shuangnet/archive/2013/04/02/2995798.html apply有两种形式: cross apply 和 oute ...
- Vue#组件
组件: 组件(Component)是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素,Vue.js 的编译器为它添加特殊功能. 使用: ...