码迷,mamicode.com
首页 > 编程语言 > 详细

C++11新特性——初始化列表 initializer_list

时间:2016-12-29 13:40:58      阅读:276      评论:0      收藏:0      [点我收藏+]

标签:list   [1]   报告   列表   二维数组   c++   括号   air   全局   

破事水:

  由于最近数据结构有个实验报告说是要对字符串进行排序,想偷个懒不想一个一个地赋值,虽然可以用strcpy和传入二级指针的形式直接写,但是这样感觉不美观漂亮。

  然后就去膜了一下C++11的新特性——初始化列表,概念就不说了,就讲下这东西具体怎么用吧,就是正常的写一个构造函数,然后把参数改为initializer_list<数据类型> &t

  如图所示技术分享

可以理解为传入的参数数据被放到了一个储存器t中,利用C++11的auto可以直接遍历这个储存器t,然后把遍历到的值给结构体用。这里用的是char 数组而不是int是因为这里有一个问题,如果把initializer_list尖括号里的类型改为char *,则会报错,因为普通的""双引号代表的字符串为实际为const 类型,实际本身为一个指针,指向全局const变量中的地址,因此const *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;
}

 

C++11新特性——初始化列表 initializer_list

标签:list   [1]   报告   列表   二维数组   c++   括号   air   全局   

原文地址:http://www.cnblogs.com/Blackops/p/6232289.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!