网站建设需要具备,怎么才能有自己的网站,成都新空间装饰公司,怎么看网站是哪家公司做的一#xff0c;统一的初始化列表
在引入c11后#xff0c;我们得出计划都可以用初始化列表进行初始化。 C11 扩大了用大括号括起的列表 ( 初始化列表 ) 的使用范围#xff0c;使其可用于所有的内置类型和用户自 定义的类型#xff0c; 使用初始化列表时#xff0c;可添加等…一统一的初始化列表
在引入c11后我们得出计划都可以用初始化列表进行初始化。 C11 扩大了用大括号括起的列表 ( 初始化列表 ) 的使用范围使其可用于所有的内置类型和用户自 定义的类型 使用初始化列表时可添加等号 () 也可不添加 。 int main()
{int i 0;int j { 0 };int k{ 0 };int l(0);//如日期类return 0;
}//对象的初始化
struct Point{int _x;int _y;};int main(){int array1[] { 1, 2, 3, 4, 5 };int array2[5] { 0 };Point p { 1, 2 };return 0;}//日期类对象的初始化
class Date
{
public:Date(int year, int month, int day):_year(year), _month(month), _day(day){cout Date(int year, int month, int day) endl;}
private:int _year;int _month;int _day;
};
int main()
{Date d1(2022, 1, 1); // old style// C11支持的列表初始化这里会调用构造函数初始化Date d2{ 2022, 1, 2 };Date d3 { 2022, 1, 3 };//这里的本质就是以该参数构造对象再拷贝给给这里的对象Date* d4 new Date[3]{ {2023,5,3}, {2022, 1, 3},{2023,1,2} };return 0;
}
数组与链表的初始化
int main()
{vectorint v { 1,2,3,4,5,6 };liststring l { hello,world };return 0;
}
并且再c11引入了std::initializer_list 一种特殊的构造方式
initiallizer_list
initializer_list是C11提供的新类型定义在头文件中。 用于表示某种特定类型的值的数组和vector一样initializer_list也是一种模板类型。即一组数据的类型。
一般它的作用也就是为了支持容器的参数列表的构造。
如下通过typeid我们来查看il的类型 库中的定义 库中实现了三个成员函数分别是首尾和大小。我们不难看出这肯定是实现了迭代器也确实是这样样他的迭代器就是他的原生指针。
int main()
{auto il { 1,2,3,4,5 };cout typeid(il).name()endl;auto it il.begin();while (it ! il.end()){cout *it;it;}cout endl;for (auto it : il){cout it;}return 0;
} 对于initailizer_list,不仅仅是一般的类型的数据的和对于vector,list,map,set等构造都支持参数列表nitailizer_list这样的初始化
int main()
{pairstring, string kv { 希尔排序,1 };mapstring, string p { kv,{冒泡排序,2},{快速排序,3}};//初始化map时除了用pair我们这里也可以用initializer_list -实际上回隐式类型转换为pairfor(auto it:p){cout it.first it.second endl;}return 0;
} 二声明
auto 在 C98 中 auto 是一个存储类型的说明符表明变量是局部自动存储类型但是局部域中定义局 部的变量默认就是自动存储类型所以 auto 就没什么价值了。 C11 中废弃 auto 原来的用法将 其用于实现自动类型腿断。这样要求必须进行显示初始化让编译器将定义对象的类型设置为初 始化值的类型。 自动类型推导更加简便的声明。实际当中我们一般范围for用
decltype 关键字 decltype 将变量的类型声明为表达式指定的类型。 int main()
{//对于类型推导 我们知道typidint i 10;double j 10.2;cout typeid(i).name() endl;cout typeid(j).name() endl;//获取类型的字符串 但不能当作类型去定义 //我们平时需要定义时就用auto定义但若我们的模板参数需要这个类型如何取到这个类型//利用关键字decltype 获取数据类型vectordecltype(j) v;v.push_back(1);v.push_back(2);for (int i 0; i v.size(); i){cout v[i] ;}decltype(j) data;//可以当作类型用定义return 0;} 三范围for 就是迭代器基础实现的遍历写起来更加方便我们差不多已经都熟练使用。 四智能指针 智能指针主要用于管理在堆上分配的内存它将普通的指针封装为一个栈对象。当栈对象的生存周期结束后会在析构函数中释放掉申请的内存从而防止内存泄漏。C 11中最常用的智能指针类型为shared_ptr,它采用引用计数的方法记录当前内存资源被多少个智能指针引用。该引用计数的内存在堆上分配。 五c11种STL库中的变化 新容器forward_list(单链表)arry(静态数组)两个哈希表封装的无序关联容器unordered_map,unordered_set。 实际应用中arry没谁用我们有vetor单链表意义也不大虽然节省空间但对于尾删效率太低下了较有大用处的是者两个无序容器. 六右值引用与移动语义重要 什么是左值什么是右值 传统的 C 语法中就有引用的语法而 C11 中新增了的右值引用语法特性。 我们之前学习的引用就叫做左值引用。无论左值引用还是右值引用都是给对象取别名。 什么是左值左值引用 左值是一个表示数据的表达式(如变量名或解引用的指针) 我们可以获取它的地址 可以对它赋 值 左值可以出现赋值符号的左边右值不能出现在赋值符号左边 。定义时 const 修饰符后的左 值不能给他赋值但是可以取它的地址。左值引用就是给左值的引用给左值取别名。 int main()
{//下面三个变量都是左值 我们可以给它赋值主要看他是否可以取地址int* p new int(1);int b 0;const int c 10;//i还是左值int i 0;int j i;} 什么是右值右值引用 右值也是一个表示数据的表达式如字面常量、表达式返回值函数返回值 ( 这个不能是左值引 用返回 ) 等等 右值可以出现在赋值符号的右边但是不能出现出现在赋值符号的左边 右值不能 取地址 。右值引用就是对右值的引用给右值取别名。 int main()
{int i 0, j 0;//如下都是右值 右值可以是表达式返回值右值无法取地址10;i j;fmin(i , j);//之前的引用都是左值引用我们来看看右值引用int r 10;double r1 i j;int min fmin(i, j);} 左值引用不能直接给给右值取别名需要const。右值引用也不能直接给左值引用这里可以move后引用。 int main()
{//左值引用给右值取别名,不能直接引用右值不能被修改因此需要constconst int i 10;int j 10;//右值引用右值int m i j;//右值引用引用左值 不能直接引用还是需要转化类型 //右值引用可以给move后的左值引用int p 10; int q 10;int r move(q);int n (const int) q;} 引入右值引用与左值引用的效果一样减少大量拷贝。 那么右值引用是如何使用的 右值引用的场景 因为在函数的返回值中如果要对函数返回的值引用则必须要满足在函数的声明周期结束后值的生命周期还在否则就无法使用引用。 那我们想要返回该如何比如说我们自己实现string里面的tostring: //那么如何实现这里的ret返回引用呢
string tostring(int x)
{string ret;while (x){int val x % 10;x x / 10;ret (val 0);}reverse(ret.begin(),ret.end());return ret;
} 在正常引用函数的返回值肯定不行。 首先函数返回值是一个右值我们需要使用右值引用其次右值引用还是要考虑到该问题函数调用完毕释放函数栈帧时对应的返回值的生命周期也结束了此时引用引用的就是个空。 首先在c中右值分为纯右值与将亡值自定义的右值。 首先对于正常的返回不调用引用过程是这样的 首先ret在这里会调用三次深拷贝代价太大那么有无优化的方案 对于这里的ret还是传值返回但是在即将销毁时我们可以将它识别是一个将亡值右值对于将亡值我们拷贝构造时使用右值引用传参移动拷贝直接把资源转移过来不再进行深度拷贝但是在进入main函数中的拷贝之后赋值是不支持右值对象的因此这里还需要实现右值赋值。
amespace myspace
{class string{public:typedef char* iterator;iterator begin(){return _str;}iterator end(){return _str _size;}string tostring(int x){string ret;while (x){int val x % 10;x x / 10;ret (val 0);}return ret;}string(const char* str ):_size(strlen(str)), _capacity(_size){_str new char[_capacity 1];strcpy(_str, str);}void swap(string s){::swap(_str, s._str);::swap(_size, s._size);::swap(_capacity, s._capacity);}// 拷贝构造string(const string s):_str(nullptr){cout string(const string s) -- 深拷贝 endl;string tmp(s._str);swap(tmp);}// 赋值重载string operator(const string s){cout string operator(string s) -- 深拷贝 endl;string tmp(s);swap(tmp);return *this;}// 移动构造 右值引用string(string s):_str(nullptr), _size(0), _capacity(0){cout string(string s) -- 移动语义 endl;swap(s);}// 移动赋值 右值引用string operator(string s){cout string operator(string s) -- 移动语义 endl;swap(s);return *this;}~string(){delete[] _str;_str nullptr;}char operator[](size_t pos){assert(pos _size);return _str[pos];}void reserve(size_t n){if (n _capacity){char* tmp new char[n 1];strcpy(tmp, _str);delete[] _str;_str tmp;_capacity n;}}void push_back(char ch){if (_size _capacity){size_t newcapacity _capacity 0 ? 4 : _capacity * 2;reserve(newcapacity);}_str[_size] ch;_size;_str[_size] \0;}//string operator(char ch)string operator(char ch){push_back(ch);return *this;}const char* c_str() const{return _str;}private:char* _str;size_t _size;size_t _capacity; // 不包含最后做标识的\0};
}
通过右值引用我们减掉了深度拷贝的代价。这里我们一般还可以通过调试查看函数调用信息
对于将亡值我们一般使用move将一个左值转化为将亡值。自定义的右值一般也是将亡值。
仔细看的话用过右值引用我们还将他的生命周期延长了我们通过右值引用使得这份资源还在。
当然我这里的右值引用移动构造对于深拷贝就能发挥它的作用浅拷贝的自定义类型没什么用。
注意注意move移动语义本是是不会改变这个值的属性而是调用后的返回值的类型发生了改变。
其次对于一个右值的引用之后它的属性是一个左值因为右值不能被修改但是右值的右值引用可以被修改否则无法实现移动构造与移动复制。
库中的一些应用 除了返回值可以被引用外移动构造与移动拷贝相对于左值的拷贝构造赋值。更加的快速和节省空间因为我们这里直接是引用。
通过右值引用实现了返回值的引用以这种方式许多场景下的应用就可以实现了。 c11后我们通过转化为右值使用移动构造移动拷贝效率就会高许多。
STL容器在c11后都增加了移动构造与移动赋值。
vector的构造与赋值 list的构造与赋值 以及push操作也基本添加了右值版本 万能引用
c11在提供右值及右值引用后还增加了万能引用。
所谓的万能引用就是模板参数的引用这里用的是但不代表是右值引用。
格式如下
templatetypename T
void PerfectForward(T t)
{Fun(t);
}
通过万能引用是左值就调左值引用是右值就调右值引用。但是还是要记住一点右值被右值引用之后属性是左值因此在处理右值传参用右值对应的接口我们都需要吧接口里的值的类型在move一下。
注意事项 针对移动构造函数和移动赋值运算符重载有一些需要注意的点如下 如果你没有自己实现移动构造函数且没有实现析构函数 、拷贝构造、拷贝赋值重载中的任 意一个。那么编译器会自动生成一个默认移动构造。默认生成的移动构造函数对于内置类 型成员会执行逐成员按字节拷贝自定义类型成员则需要看这个成员是否实现移动构造 如果实现了就调用移动构造没有实现就调用拷贝构造。 如果你没有自己实现移动赋值重载函数且没有实现析构函数 、拷贝构造、拷贝赋值重载中 的任意一个那么编译器会自动生成一个默认移动赋值。默认生成的移动构造函数对于内 置类型成员会执行逐成员按字节拷贝自定义类型成员则需要看这个成员是否实现移动赋 值如果实现了就调用移动赋值没有实现就调用拷贝赋值。 ( 默认移动赋值跟上面移动构造 完全类似 ) 如果你提供了移动构造或者移动赋值编译器不会自动提供拷贝构造和拷贝赋值。 七.defalut与delete 强制生成默认函数的关键字default,;取消生成默认函数的关键字delete: C11可以让你更好的控制要使用的默认函数。假设你要使用某个默认的函数但是因为一些原 因这个函数没有默认生成。比如我们提供了拷贝构造就不会生成移动构造了那么我们可以 使用default关键字显示指定移动构造生成。 当然我们也可以取消不让这些函数生成。 八模板的可变参数
首先我们知道函数的参数可以是可变参数c11对模板也引入了可变参数。
这里的参数我们叫可变参数包
templateclass ...Args //模板的可变参数包
void show(Args...arg)
{//可以包含任意多个类型的参数
} STL容器中的 empalce相关接口函数就是可变参数 emplace 系列的接口支持模板的可变参数并且也可以万能引用。 以vector为例在c11当中增加了两个家口emplace与emplace_back,这两个接口都是用来 插入的emplace_back尾插那么这两个插入与insert有什么区别呢 首先就是可变参数emplace会根据参数将Args作为构造函数的参数构造出一个该元素然后插入其中。 #include iostream
#include vectorint main ()
{std::vectorint myvector {10,20,30};myvector.emplace_back (100);myvector.emplace_back (200);std::cout myvector contains:;for (auto x: myvector)std::cout x;std::cout \n;return 0;
}//运行结果 myvector contains: 10 20 30 100 200 在引入移动构造与构造时insert就是先构造在移动构造插入而对于emplace是直接构造插入。对于大一点的浅拷贝的自定义类型emplace相对于会更好一点。 九lambda表达式
在c98之前比如我们在用sort进行排序时我们是传一个仿函数且该种排序只能支持库里提供的类型另外的类型就需要我们重写一个仿函数传进去。
操了c11,虽然问题得到了解决但是人们认为这样写还是太过麻烦比如每次传参进去的仿函数都必须以它如何排序的方式进行命名因为具体实现的比较我们是看不到的因此借鉴了python的lambda表达式实现更加方便更加清晰的比较。
lambda表达式的构成 lambda 表达式书写格式 [capture-list] (parameters) mutable - return-type { statement } lambda 表达式各部分说明 [capture-list] : 捕捉列表 该列表总是出现在 lambda 函数的开始位置 编译器根据 [] 来 判断接下来的代码是否为 lambda 函数 捕捉列表能够捕捉上下文中的变量供 lambda 函数使用 。 (parameters) 参数列表。与 普通函数的参数列表一致 如果不需要参数传递则可以 连同 () 一起省略。 mutable 默认情况下 lambda 函数总是一个 const 函数 mutable 可以取消其常量 性。使用该修饰符时参数列表不可省略 ( 即使参数为空 ) 。---不需要一般可以忽略不写 -returntype 返回值类型 。用 追踪返回类型形式声明函数的返回值类型 没有返回 值时此部分可省略。 返回值类型明确情况下也可省略由编译器对返回类型进行推 导 。 {statement} 函数体 。在该函数体内除了可以使用其参数外还可以使用所有捕获 到的变量。 事实上lalmbda本质就是一个函数对象我们一般这样去使用它
int main()
{//比如简单写一个打印出入的参数
auto it [] (int x) -int { cout x; return 0; };//捕捉列表 参数列表 返回类型 函数体//我们一般用auto自定推导类型来获取这个对象it(1);//对象传参
//当然我们也可以省略返回值类型它可以自动推导
//auto it[](int x){ cout x; return 0; };return 0;
} 那么我们就可以用lambda去替换仿函数。
现在我们就可以用lambda表达式去实现仿函数一样的功能
int main()
{vectorGoods v { { 苹果, 2.1, 5 }, { 香蕉, 3, 4 }, { 橙子, 2.2, 3 }, { 菠萝, 1.5, 4 } };//仿函数sort(v.begin(), v.end(), ComparePriceLess());sort(v.begin(), v.end(), ComparePriceGreater());//lambda//这里的lambda可以理解为匿名函数对象sort(v.begin(), v.end(), [](Goods it1, Goods it2) {return it1._price it2._price; });sort(v.begin(), v.end(), [](Goods it1, Goods it2) {return it1._price it2._price; });return 0;
}
因为sort函数提供的是模板对于比较这一部分因此我们只要传参可调用的对象就可以。
那么有人就开始疑惑了lambda返回类型到底是一个什么通过typeid我们可以看看
int main()
{auto p[](Goods it1, Goods it2) {return it1._price it2._price; };auto q [](Goods it1, Goods it2) {return it1._price it2._price; };cout typeid(p).name()endl;cout typeid(q).name()endl;
} 实际上是一个类,每个lambda都有自己对应的类。
关于捕捉列表lambda表的是其他构成我们能理解但对于捕捉列表是什么呢 所谓的捕捉就是可以将父作用域里的变量直接拿来使用但传值过来的变量无法被修改。
除了传值也可以传引用捕捉但在书写方面与取地址写法一样注意别混淆。
传值就是普通函数传参传引就是引用传参。如果想捕捉地址就实现把地址取出来。
当然捕捉引用时它自动传参时此时就不再使用mutable了。
即
int x 1; int y 2;//不捕获时auto q [](int x, int y)-void{int temp x;x y;y temp;};q(x, y);//这里只是作为参数传递过去形参的改变不影响实参coutx y endl;//捕获时但注意这里虽然捕获了可以直接用//但此时默认情况下这里的函数是不能修改的需要加入mutable表示可修改auto p [x, y]()mutable- void {int temp x;x y;y temp;};p();//这里只是作为参数传递过去形参的改变不影响实参cout x y endl;auto n [x, y]()- void{int temp x;x y;y temp;};n();//这里是传引用因此会完成交换cout x y endl;
lambda的原理也是仿函数。
十包装器
function
有了仿函数lambda实际上还有函数指针这三个本质其实都一样都是一个函数可以被其他对象调用去实现某个功能。因为除了函数指针和仿函数还能传lanmbda的类型我们是不得而知的需要function去将这些包装我们能直接获取其类型。
因此在c11中又提出一个概念包装器就是跟适配器一样。
我们之前学习单链表栈和队列等就是用vectorlist去适配出这样的一个结构。
而这里的包装器就是用函数指针或者lambda仿函数去适配包装我们所需要的一个“函数对象”去被调用。
语法class function std::function 在头文件 functional // 类模板原型如下 template class T function ; template class Ret , class ... Args class function Ret ( Args ...) ; 模板参数说明 Ret : 被调用函数的返回类型 Args… 被调用函数的形参 function的本质就是一个类模板适配就是去适配 仿函数函数指针lambda的其中一个。
//包装器 function
//我们还是以交换两个整数为例
//仿函数
struct Swap1
{void operator()(int x, int y){int temp x;x y;y temp;}
};
//函数
void Swap2(int x,int y)
{int temp x;x y;y temp;
}
//lambda
auto Swap3 [](int x, int y)-void {int temp x; x y; y temp; };
//首先我们先来使用一下
int main()
{int x 1; int y 2;//可以包装这三个functionvoid(int, int) p1 Swap1();p1(x, y);cout x y endl;functionvoid(int, int) p2 Swap2;p2(x, y);cout x y endl;functionvoid(int, int) p3 Swap3;p3(x, y);cout x y endl;//通过function模板 在传入参数时我们就可以选择三个其中之一进行传参mapstring, functionvoid(int, int) op { {仿函数, Swap1()},{函数指针, Swap2},{lambda, Swap3} };/*m.insert(make_pair(仿函数, Swap1()));m.insert(make_pair(函数指针, Swap2));m.insert(make_pair(仿函数, Swap3));*///mapstring, functionvoid(int, int) m { {仿函数, p1},{函数指针, p2},{仿函数, p3} };op[仿函数](x, y); op[函数指针](x, y);op[lambda](x, y);}当然这里我们的函数的参数类型是一样的。
包装成员函数
在包装成员函数时我们需要注意几点
1.指定类域
2.要在成员函数前加符号才表示成员函数的地址
3.传参需要加入他的地址
class Func
{
public:static int Add1(int x, int y){return x y;}double Add2(double x, double y){return x y;}
};
int main()
{//如果是static我们可以直接包装functionint(int, int) p1 Func::Add1;cout p1(1, 2)endl;//如果是普通成员函数,则还需要一个对象指针Func a;functiondouble(Func*, double, double) p2 Func::Add2;cout p2(a, 1.1, 2.1) endl;//对象也可以functiondouble(Func a, double, double) p3 Func::Add2;Func b;cout p3(b,1.2, 2.3) endl;
}
bind
除了function还有第二个包装器bind: std::bind 函数定义在头文件中 是一个函数模板它就像一个函数包装器 ( 适配器 ) 接受一个可 调用对象 callable object 生成一个新的可调用对象来 “ 适应 ” 原对象的参数列表 。一般而 言我们用它可以把一个原本接收 N 个参数的函数 fn 通过绑定一些参数返回一个接收M个M 可以大于N但这么做没什么意义参数的新函数 。同时使用 std::bind 函数还可以实现参数顺 序调整等操作。 // 原型如下 template class Fn , class ... Args /* unspecified */ bind ( Fn fn , Args ... args ); // with return type (2) template class Ret , class Fn , class ... Args /* unspecified */ bind ( Fn fn , Args ... args ) 可以用来调整参数的位置
int main()
{//表示绑定函数plus 参数分别由调用 func1 的第一二个参数指定std::functionint(int, int) func1 std::bind(Plus, placeholders::_1, placeholders::_2);//表示绑定函数 plus 的第一二为 1 2auto func2 std::bind(Plus, 1, 2); cout func1(1, 2) endl;cout func2() endl;
}
文章转载自: http://www.morning.wwgpy.cn.gov.cn.wwgpy.cn http://www.morning.cpfbg.cn.gov.cn.cpfbg.cn http://www.morning.rqqmd.cn.gov.cn.rqqmd.cn http://www.morning.rkypb.cn.gov.cn.rkypb.cn http://www.morning.gklxm.cn.gov.cn.gklxm.cn http://www.morning.fdfdz.cn.gov.cn.fdfdz.cn http://www.morning.beiyishengxin.cn.gov.cn.beiyishengxin.cn http://www.morning.hjsrl.cn.gov.cn.hjsrl.cn http://www.morning.ngznq.cn.gov.cn.ngznq.cn http://www.morning.yhywr.cn.gov.cn.yhywr.cn http://www.morning.lznfl.cn.gov.cn.lznfl.cn http://www.morning.clwhf.cn.gov.cn.clwhf.cn http://www.morning.cttti.com.gov.cn.cttti.com http://www.morning.kpypy.cn.gov.cn.kpypy.cn http://www.morning.wplbs.cn.gov.cn.wplbs.cn http://www.morning.xkhxl.cn.gov.cn.xkhxl.cn http://www.morning.snrhg.cn.gov.cn.snrhg.cn http://www.morning.dmzfz.cn.gov.cn.dmzfz.cn http://www.morning.chbcj.cn.gov.cn.chbcj.cn http://www.morning.stsnf.cn.gov.cn.stsnf.cn http://www.morning.ymwnc.cn.gov.cn.ymwnc.cn http://www.morning.kdgcx.cn.gov.cn.kdgcx.cn http://www.morning.rcjqgy.com.gov.cn.rcjqgy.com http://www.morning.jmspy.cn.gov.cn.jmspy.cn http://www.morning.xqzrg.cn.gov.cn.xqzrg.cn http://www.morning.zpfr.cn.gov.cn.zpfr.cn http://www.morning.jxltk.cn.gov.cn.jxltk.cn http://www.morning.qydgk.cn.gov.cn.qydgk.cn http://www.morning.ogzjf.cn.gov.cn.ogzjf.cn http://www.morning.rhdqz.cn.gov.cn.rhdqz.cn http://www.morning.qqbw.cn.gov.cn.qqbw.cn http://www.morning.cbnlg.cn.gov.cn.cbnlg.cn http://www.morning.mnbgx.cn.gov.cn.mnbgx.cn http://www.morning.hxrfb.cn.gov.cn.hxrfb.cn http://www.morning.sgbsr.cn.gov.cn.sgbsr.cn http://www.morning.lsyk.cn.gov.cn.lsyk.cn http://www.morning.lkhgq.cn.gov.cn.lkhgq.cn http://www.morning.rbkml.cn.gov.cn.rbkml.cn http://www.morning.ylxgw.cn.gov.cn.ylxgw.cn http://www.morning.lltdf.cn.gov.cn.lltdf.cn http://www.morning.hjjkz.cn.gov.cn.hjjkz.cn http://www.morning.qykxj.cn.gov.cn.qykxj.cn http://www.morning.zmlbq.cn.gov.cn.zmlbq.cn http://www.morning.tqbw.cn.gov.cn.tqbw.cn http://www.morning.tklqs.cn.gov.cn.tklqs.cn http://www.morning.cwrnr.cn.gov.cn.cwrnr.cn http://www.morning.jgzmr.cn.gov.cn.jgzmr.cn http://www.morning.bpmtz.cn.gov.cn.bpmtz.cn http://www.morning.lbbrw.cn.gov.cn.lbbrw.cn http://www.morning.bmsqq.cn.gov.cn.bmsqq.cn http://www.morning.cmhkt.cn.gov.cn.cmhkt.cn http://www.morning.msmtf.cn.gov.cn.msmtf.cn http://www.morning.rkck.cn.gov.cn.rkck.cn http://www.morning.bkgfp.cn.gov.cn.bkgfp.cn http://www.morning.qxdrw.cn.gov.cn.qxdrw.cn http://www.morning.okiner.com.gov.cn.okiner.com http://www.morning.rtsx.cn.gov.cn.rtsx.cn http://www.morning.bswxt.cn.gov.cn.bswxt.cn http://www.morning.gnghp.cn.gov.cn.gnghp.cn http://www.morning.smjyk.cn.gov.cn.smjyk.cn http://www.morning.dmsxd.cn.gov.cn.dmsxd.cn http://www.morning.rcttz.cn.gov.cn.rcttz.cn http://www.morning.qkdbz.cn.gov.cn.qkdbz.cn http://www.morning.xinyishufa.cn.gov.cn.xinyishufa.cn http://www.morning.brwnd.cn.gov.cn.brwnd.cn http://www.morning.xcszl.cn.gov.cn.xcszl.cn http://www.morning.plflq.cn.gov.cn.plflq.cn http://www.morning.fpqsd.cn.gov.cn.fpqsd.cn http://www.morning.bnxnq.cn.gov.cn.bnxnq.cn http://www.morning.gcspr.cn.gov.cn.gcspr.cn http://www.morning.clhyj.cn.gov.cn.clhyj.cn http://www.morning.phlrp.cn.gov.cn.phlrp.cn http://www.morning.kbqbx.cn.gov.cn.kbqbx.cn http://www.morning.qghjc.cn.gov.cn.qghjc.cn http://www.morning.cjmmt.cn.gov.cn.cjmmt.cn http://www.morning.rhfbl.cn.gov.cn.rhfbl.cn http://www.morning.btblm.cn.gov.cn.btblm.cn http://www.morning.mynbc.cn.gov.cn.mynbc.cn http://www.morning.khtyz.cn.gov.cn.khtyz.cn http://www.morning.zxrtt.cn.gov.cn.zxrtt.cn