网站建设 源美设计,网站动态背景怎么做,如何自己做公众号,手机网站与PC网站目录
string的使用#xff1a;#xff1a; 1.string类介绍 2.string常用接口说明
string相关习题训练#xff1a;#xff1a; 1.仅仅反转字母 2.找字符串中第一个只出现一次的字符 3.字符串里面最后一个单词的长度 4.验证一个字符串是否是回文 5.字符串相加 6.翻转字符串…目录
string的使用 1.string类介绍 2.string常用接口说明
string相关习题训练 1.仅仅反转字母 2.找字符串中第一个只出现一次的字符 3.字符串里面最后一个单词的长度 4.验证一个字符串是否是回文 5.字符串相加 6.翻转字符串II区间部分翻转 7.翻转字符串III翻转字符串中的单词 8.字符串相乘 string及其模拟实现
1.string类介绍 1.string类是basic_string模板类的一个实例它使用char来实例化basic_string模板类并用char_traits和allocator作为basic_string的默认参数。
2.string是表示字符串的字符类。
3.该类的接口与常规容器的接口基本相同再添加了一些专门用来操作string的常规操作。
4.注意这个类独立于所使用的编码来处理字节如果用来处理多字节或变长字符(如UTF-8)的序列这个类的所有成员(如长度或大小)以及它的迭代器将仍然按照字节来操作而不是实际编码的字符来操作。
5.string在底层实际是basic_string模板类的别名typedef basic_stringchar,char_traits,allocator string。
6.不能操作多字节或者变长字符的序列。
templateclass T
class basic_string
{
private:T* _str;size_t size;size_t capacity;
};
typedef basic_stringchar string;扩展
字符集是一个系统支持的所有抽象字符的集合也就是一系列字符的集合。字符是各种文字和符号的总称包括各国家文字、标点符号、图形符号、数字等常见的字符集有ASCII字符集、GB2312字符集(主要用于处理中文汉字)、GBK字符集(主要用于处理中文汉字)、Unicode字符集等。
字符编码是一套法则使用该法则能够对自然语言的字符的一个字符集(如字母表或音节表)与计算机能识别的二进制数字进行配对。即它能在符号集合与数字系统之间建立对应关系是信息处理的一项基本技术。通常人们用符号集合(一般情况下就是文字)来表达信息而计算机的信息处理系统则是以二进制的数字来存储和处理信息的。字符编码就是将符号转换为计算机能识别的二进制编码。
一般一个字符集等同于一个编码方式ANSI体系(ANSI是一种字符代码为使计算机支持更多语言通常使用0x80~0xFF范围的2个字节来表示一个字符)的字符集如ASCII、ISO 8859-1、GB2312、GBK等等都是如此。一般我们说一种编码都是针对某一特定的字符集。
一个字符集也可以有多种编码方式例如UCS字符集(也是Unicode使用的字符集)上有UTF-8、UTF-16、UTF-32等编码方式。
从计算机字符编码的发展历史角度来看大概经历了三个阶段
第一个阶段ASCII字符集和ASCII编码
计算机刚开始只支持英语其他语言不能够在计算机上存储和显示。ASCII用一个字节的7个比特位表示一个字符第一个位置0.后来为了更多的欧洲常用字符又对ASCII进行了扩展又有了EASCIIEASCII用8位表示一个字符使它能多表示128个字符支持了部分西欧字符。
第二个阶段ANSI编码(本地化)
为使计算机支持更多语言通常使用0x80~0xFF范围的两个字节来表示一个字符。比如汉字 中 在中文操作系统中使用 [0xD6,0xD0] 这两个字节存储。不同的国家和地区制定了不同的标准由此产生了GB2312BIG5JIS等各自的编码标准。这些使用2个字节来代表一个字符的各种汉字延申编码方式称为ANSI编码在简体中文系统下ANSI编码代表GB2312编码在日文操作系统下ANSI编码代表JIS编码。不同ANSI编码之间互不兼容当信息在国际化间交流时无法将属于两种语言的文字存出在同一段ANSi编码的文本中。
第三个阶段Unicode(国际化)
为了使国际间信息交流更加方便国际组织制定了Unicode字符集为各种语言中的每一个字符设定了统一并且唯一的数字编号以满足跨语言、跨平台进行文本交换、处理的要求。Unicode常见的有三种编码方式UTF-8(1、2、3、4个字节表示)、UTF-16(2个字节表示)、UTF-32(4个字节表示)。
为什么string类要实现成模板
我们印象中单个字符就是一个字节也就是char类型但是由于编码问题会有2字节和4字节的字符类型。
类型编码类型stringUTF-8charwstringUnicodewchar_tu16stringUTF-16char16_tu32stringUTF-32char32_t
正是由于了字符串的多种类型所以存在了basic_strng模板。
2.string常用接口说明
在使用string类时必须包含#include头文件以及using namespace std;
1.string类对象的常见构造
函数名称功能说明string()构造空的string类对象即空字符串string(const char* s)用C-string来构造string类对象string(size_t n,char c)string类对象中包含n个字符cstring(const string s)拷贝构造函数
void Teststring()
{string s1; //构造空的string类对象s1string s2(hello world); //用C格式字符串构造string类对象s2string s3(3,x);//用3个字符创建对象 string s4(s2);//拷贝构造
}
2.string类对象的容量操作
函数名称功能说明size返回字符串有效字符长度length返回字符串有效字符长度capacity返回总空间大小empty检测字符串是否为空串是返回true否则返回falseclear清空有效字符reserve为字符串预留空间resize将有效字符的个数改成n个外出的多余空间用字符c填充
// 测试string容量相关的接口
// size/clear/resize
void Teststring1()
{// 注意string类对象支持直接用cin和cout进行输入和输出string s(hello, world!!!);cout s.size() endl;cout s.length() endl;cout s.capacity() endl;cout s endl;// 将s中的字符串清空注意清空时只是将size清0不改变底层空间的大小s.clear();cout s.size() endl;cout s.capacity() endl;// 将s中有效字符个数增加到10个多出位置用a进行填充// “aaaaaaaaaa”s.resize(10, a);cout s.size() endl;cout s.capacity() endl;// 将s中有效字符个数增加到15个多出位置用缺省值\0进行填充// aaaaaaaaaa\0\0\0\0\0// 注意此时s中有效字符个数已经增加到15个s.resize(15);cout s.size() endl;cout s.capacity() endl;cout s endl;// 将s中有效字符个数缩小到5个s.resize(5);cout s.size() endl;cout s.capacity() endl;cout s endl;
}//
void Teststring2()
{string s;// 测试reserve是否会改变string中有效元素个数s.reserve(100);cout s.size() endl;cout s.capacity() endl;// 测试reserve参数小于string的底层空间大小时是否会将空间缩小s.reserve(50);cout s.size() endl;cout s.capacity() endl;
}// 利用reserve提高插入数据的效率避免增容带来的开销
//
void TestPushBack()
{string s;size_t sz s.capacity();cout making s grow:\n;for (int i 0; i 100; i){s.push_back(c);if (sz ! s.capacity()){sz s.capacity();cout capacity changed: sz \n;}}
}// 构建vector时如果提前已经知道string中大概要放多少个元素可以提前将string中空间设置好
void TestPushBackReserve()
{string s;s.reserve(100);size_t sz s.capacity();cout making s grow:\n;for (int i 0; i 100; i){s.push_back(c);if (sz ! s.capacity()){sz s.capacity();cout capacity changed: sz \n;}}
}
注意
1.size()与length()方法底层实现原理完全相同引入size()的原因是为了和其他容器的接口保持一致一般情况下基本都是用size()。
2.clear()只是将string中有效字符清空不改变底层空间大小。
3.resize(size_t n)与resize(size_t n,char c)都是将字符串中有效字符个数改变到n个不同的是当字符个数增多时resize(n)用0来填充多出的元素空间resize(size_t n,char c)用字符c来填充多出的元素空间。注意resize在改变元素个数时如果是将元素个数增多可能会改变底层容量的大小如果是将元素个数减少底层空间总大小不变。
4.resize是改变它的sizereserve是改变它的capacity。但要注意resize既会改变size也可能影响capacity。
5.reserve(size_t res_arg 0)为string预留空间不改变有效元素个数当reserve的参数小于string的底层空间总大小时reserve不会改变容量大小。
3.string类对象的访问及遍历操作
函数名称功能说明operator[]返回pos位置的字符begin endbegin()获取第一个字符的迭代器 end()获取最后一个字符下一个位置的迭代器rbegin rendrbegin():获取倒数第一个有效字符的迭代器 rend()获取第一个字符的迭代器范围forC11支持更简洁的范围for的新遍历方式
// string的遍历
// begin()end() for[] 范围for
// 注意string遍历时使用最多的还是for下标 或者 范围for(C11后才支持)
// begin()end()大多数使用在需要使用STL提供的算法操作string时比如采用reverse逆置string
void Teststring3()
{string s1(hello world);const string s2(Hello world);cout s1 s2 endl;cout s1[0] s2[0] endl;s1[0] H;cout s1 endl;// s2[0] h; 代码编译失败因为const类型对象不能修改
}void Teststring4()
{string s(hello Bit);// 3种遍历方式// 需要注意的以下三种方式除了遍历string对象还可以遍历是修改string中的字符// 另外以下三种方式对于string而言第一种使用最多// 1. foroperator[]for (size_t i 0; i s.size(); i)cout s[i] endl;// 2.迭代器string::iterator it s.begin();while (it ! s.end()){cout *it endl;it;}// string::reverse_iterator rit s.rbegin();// C11之后直接使用auto定义迭代器让编译器推到迭代器的类型auto rit s.rbegin();while (rit ! s.rend()){cout *rit endl;}// 3.范围forfor (auto ch : s){cout ch endl;}
}//const正向迭代器(不能改变*it)
void test(const string s)
{string::const_iterator it s.begin();while (it ! s.end()){cout *it;it;}
}
//const反向迭代器(不能改变*it)
void test(const string s)
{string::const_reverse_iterator rit s.rbegin();while (rit ! s.rend()){cout *rit;rit;}
}
void Print(const string s)
{//普通的正向/反向迭代器支持读写容器数据 不是it不可以修改 是it指向的内容不可以修改//const的正向/反向只支持读不支持修改容器数据string::const_iterator it s.begin();while (it ! s.end()){cout *it ;it;}cout endl;string const_reverse_iterator rit s.rbegin();//auto rit s.rbegin();while (rit ! s.rend()){cout *rit ;rit;}cout endl;
}
4.string类对象的修改操作
函数名称功能说明push_back在字符串后尾插字符cappend在字符串后追加一个字符串operator在字符串后追加字符串strc_str返回C格式字符串find npos从字符串pos位置开始往后找字符c返回该字符在字符串中的位置rfind从字符串pos位置开始往前找字符c返回该字符在字符串中的位置substr在str中从pos位置开始截取n个字符然后将其返回
注意
1.在string尾部追加字符时s.push_back(c) / s.append(1,c) / s c三种的实现方式差不多一般情况下string类的操作用的比较多操作不仅可以连接单个字符还可以连接字符串。
2.对string操作时如果能够大概预估到放多少字符可以先通过reserve把空间预留好。
void test_string1()
{string s1(hello world hello world);string s2(hello world hello world);string s3(s2);string s4(s3);//assign可以理解为将原字符对象清空重新进行赋值s1.assign(hello bit, 5);cout s1 endl;//replace是对字符对象的部分取代s2.replace(6, 5, bit);cout s2 endl;//将 替换成20%size_t pos s3.find( );while (pos ! strinng::npos){s3.replace(pos, 1, 20%);pos s3.find( , pos 3);}cout s3 endl;string ret;//s4的长度空格个数*2//ret.reserve(s4.size() space_size*2);for (auto ch: s4){if (ch ! ){ret ch;}else{ret %20;}}cout ret endl;
}
//用C语言形式读取文件
void test_string2()
{string file(test.cpp);//c_str返回C语言形式的字符串char*FILE* fout fopen(file.c_str(), r);assert(fout);char ch fgetc(fout);while (ch ! EOF){cout ch;ch fgetc(fout);}fclose(fout);
}
//要求取出一个文件的后缀
void test_string3()
{//Test.cppstring file;cin file;//要求取后缀//size_t pos file.find(.);//rfind倒着找 适用于Test.zip.tarsize_t pos file.rfind(.);if (pos ! string::npos){//substr:取出一个对象的一部分构建成string对象进行返回//string suffix file.substr(pos, file.size() - pos);//substr的函数形式:string substr(size_t pos 0,size_t len npos) 默认取到结尾string suffix file.substr(pos);cout suffix endl;}
}
// 测试string
// 1. 插入(拼接)方式push_back append operator
// 2. 正向和反向查找find() rfind()
// 3. 截取子串substr()
// 4. 删除erase
void Teststring5()
{string str;str.push_back( ); // 在str后插入空格str.append(hello); // 在str后追加一个字符hellostr b; // 在str后追加一个字符b str it; // 在str后追加一个字符串itcout str endl;cout str.c_str() endl; // 以C语言的方式打印字符串// 获取file的后缀//一闭一开才是距离string file(string.cpp);size_t pos file.rfind(.);string suffix(file.substr(pos, file.size() - pos));cout suffix endl;// npos是string里面的一个静态成员变量// static const size_t npos -1;// 取出url中的域名string url(http://www.cplusplus.com/reference/string/string/find/);cout url endl;size_t start url.find(://);if (start string::npos){cout invalid url endl;return;}start 3;size_t finish url.find(/, start);string address url.substr(start, finish - start);cout address endl;// 删除url的协议前缀pos url.find(://);url.erase(0, pos 3);cout url endl;
}
5.string类非成员函数
函数名称功能说明operator尽量少用因为传值返回导致深拷贝效率低operator输入运算符重载operator输出运算符重载getline获取一行字符串relational operators大小比较
注流提取是不能接收到空格和换行的需要接收一行的时候需要使用getline
6.vs和g下string结构的说明
注意下述结构是在32位平台下进行验证32位平台下指针占4个字节。
vs下string的结构
string总共占28个字节内部结构稍微复杂一点先是有一个联合体联合体用来定义string中字符串的存储空间
1.当字符串长度小于16时使用内部固定的字符数组来存放
2.当字符串长度大于等于16时从堆上开辟空间
union _Bxty
{ // storage for small buffer or pointer to larger onevalue_type _Buf[_BUF_SIZE];pointer _Ptr;char _Alias[_BUF_SIZE]; // to permit aliasing
} _Bx;
这种设计也是有一定道理的大多数情况下字符串的长度都小于16那string对象创建好之后内部已经有了16个字符数组的固定空间不需要通过堆创建效率高
其次还有一个size_t字段保存字符串长度一个size_t字段保存从堆上开辟空间总的容量
最后还有一个指针做一些其他事情。
故总共占16444 28个字节 g 下string的结构
g下string是通过写时拷贝实现的string对象总共占4个字节内部只包含了一个指针该指针将来指向一块堆空间内部包含了如下字段
1.空间总大小
2.字符串有效长度
3.引用计数
4.指向堆空间的指针用来存储字符串
struct _Rep_base
{size_type _M_length;size_type _M_capacity;_Atomic_word _M_refcount;
};
写时拷贝是在浅拷贝的基础之上增加了引用计数的方式实现的。
引用计数用来记录资源使用者的个数。在构造时将资源的计数给成1每增加一个对象使用该资源就给计数增加1当某个对象销毁时先给该计数减一然后再检查是否需要释放资源如果计数为1说明该对象是资源的最后一个使用者将该资源释放否则就不能释放因为还有其他对象在使用该资源。
像begin() end() rbegin() rend() operator[]的非const版本和const版本也都实现了 但像size这种类型的函数就只实现了const版本 push_back只实现了非const版本 那么哪些函数只实现const/非const版本 哪些函数两者都实现了呢 1.只读功能的函数实现const版本即可 2.只写功能的函数提供非const版本 3.读写功能的函数实现const非const版本
string相关习题训练
1.仅仅反转字母 代码1
class Solution
{
public:string reverseOnlyLetters(string s){size_t begin 0, end s.size() - 1;while (begin end){while (begin end !isalpha(s[begin])){begin;}while (begin end !isalpha(s[end])){--end;}swap(s[begin], s[end]);begin;--end;}return s;}
};
代码2
class Solution
{
public:bool isLetter(char ch){if (ch a ch z)return true;if (ch A ch Z)return true;return false;}string reverseOnlyLetters(string S) {if (S.empty())return S;size_t begin 0, end S.size() - 1;while (begin end){while (begin end !isLetter(S[begin]))begin;while (begin end !isLetter(S[end]))--end;swap(S[begin], S[end]);begin;--end;}return S;}
};
2.找字符串中第一个只出现一次的字符 class Solution
{
public:int firstUniqChar(string s){int count[26] { 0 };//统计次数for (auto ch : s){count[ch - a];}//找第一个只出现一次的字符for (size_t i 0; i s.size(); i){if (count[s[i]] - a 1){return i;}}return -1;}
};
3.字符串里面最后一个单词的长度 //报错原因:cin遇到空格 一次提取结束 空格之后的字符串内容仍然在缓冲区中
//int main()
//{
// string str;
// cin str;
// size_t pos str.rfind( );
// //下标相减 左闭右开就是个数
// cout str.size() - pos - 1 endl;
// return 0;
//}
//getline函数:
//istream getline(istream is,string str,char delim) 可以指定字符提取结束
//istream getline(istream is, string str) 默认换行提取结束
代码1
int main()
{string str;getline(cin, str);size_t pos str.rfind( );//下标相减 左闭右开就是个数cout str.size() - pos - 1 endl;return 0;
}
代码2
int main()
{string line;// 不要使用cinline,因为会它遇到空格就结束了// while(cinline)while(getline(cin, line)){size_t pos line.rfind( );coutline.size()-pos-1endl;}return 0;
}
4.验证一个字符串是否是回文 class Solution
{
public:bool isLetterOrNumber(char ch){return (ch 0 ch 9)|| (ch a ch z)|| (ch A ch Z);}bool isPalindrome(string s){//先小写字母转换成大写 再进行判断for (auto : ch:s){if (ch a ch z){ch - 32;}}int begin 0, end s.size() - 1;while (begin end){while (begin end !isLetterOrNumber(s[begin])){begin;}while (begin end !isLetterOrNumber(s[end])){--end;}if (s[begin] ! s[end]){return false;}else{begin;--end;}}return true;}
};
5.字符串相加 方法一:
class Solution
{
public:string addStrings(string num1, string num2){int end1 num1.size() - 1, end2 num2.size() - 1;//最开始进位赋值为0int carry 0;string retStr;while (end1 0 || end2 0){int val1 end1 0 ? num1[end1] - 0 : 0;int val2 end2 0 ? nums[end2] - 0 : 0;int ret val1 val2 carry;carry ret / 10;ret % 10;/*if (ret 9){ret - 10;carry 1;}else{carry 0;}*/retStr.insert(0, 1, ret 0);--end1;--end2;}if (carry 1){retStr.insert(0, 1, 1);}return retStr;}
};
方法二:
class Solution
{
public:string addStrings(string num1, string num2){int end1 num1.size() - 1, end2 num2.size() - 1;//最开始进位赋值为0int carry 0;string retStr;retStr.reserve(max(num1.size(), num2.size()) 1);while (end1 0 || end2 0){int val1 end1 0 ? num1[end1] - 0 : 0;int val2 end2 0 ? nums[end2] - 0 : 0;int ret val1 val2 carry;carry ret / 10;ret % 10;retStr (0 ret);--end1;--end2;}if (carry 1){retStr 1;}reverse(retStr.begin(), retStr.end());return retStr;}
};
6.翻转字符串 //思路
//收尾交换进行翻转
class Solution
{
public:void reverseString(vectorchar s){if (s.empty()){return;}int start 0;int end s.size() - 1;while (start end){swap(s[start], s[end]);start;end--;}}
};
7.翻转字符串II区间部分翻转 class Solution
{
public://翻转start到end区间的字符串void Reverse(string s, int start, int end){char tmp;end--;while (start end){tmp s[start];s[start] s[end];s[end] tmp;start;end--;}}string reverseStr(string s, int k){int len s.size();for (int i 0; i len; i 2 * k){if (i k len){Reverse(s, i, i k);}else{Reverse(s, i, len);}}return s;}
};
8.翻转字符串III翻转字符串中的单词 //思路
//1. 通过查找空格分割单词
//2. 针对分割的单词进行翻转
class Solution
{
public:void Reverse(string s, int start, int end){char tmp;while (start end){tmp s[start];s[start] s[end];s[end] tmp;start;end--;}}string reverseWords(string s){size_t start 0;size_t end 0;while (start s.size()){end s.find( , start);if (end string::npos){end s.size();break;}Reverse(s, start, end - 1);start end 1;}Reverse(s, start, end - 1);return s;}
};
9.字符串相乘 //思路
//1. 下翻转数据
//2. 按位相乘
//3. 将乘得的结果进行错位相加模拟乘法的笔算过程
class Solution
{
public:void MulItem(string tmp, string num1, char a){int i 0, sign 0;int mul 0;while (i num1.size()){mul (num1[i] - 0) * (a - 0) sign;if (mul 10){sign mul / 10;mul % 10;}else{sign 0;}tmp.push_back(mul 0);i;}if (sign 0){tmp.push_back(sign 0);}}//对应为相加sign进位采用引用传递int AddItem(int a, int b, int sign){int add a b sign;if (add 10){sign 1;add - 10;}else{sign 0;}return add;}//错位相加void MoveAdd(string result, string tmp, int k){int i, j;i k;j 0;int sign 0;while (i result.size() j tmp.size()){result[i] AddItem(result[i] - 0, tmp[j] - 0, sign) 0;i;j;}while (i result.size() sign){result[i] AddItem(result[i] - 0, 0, sign) 0;i;}while (j tmp.size()){int v AddItem(0, tmp[j] - 0, sign);result.push_back(v 0);j;}if (sign){result.push_back(sign 0);}}string multiply(string num1, string num2){//先翻转数据方便进位处理reverse(num1.begin(), num1.end());reverse(num2.begin(), num2.end());string tmp, result;for (int i 0; i num2.size(); i){//使用num2的每一个数据乘以num1MulItem(tmp, num1, num2[i]);//将乘得的结果进行错位相加MoveAdd(result, tmp, i);tmp.clear();}while (result.size() ! 1 result.back() 0){result.pop_back();}//翻转数据恢复数据reverse(result.begin(), result.end());return result;}
};
10.字符串转换成整数 //思路
//1. 要考虑正负数
//2. 要考虑数据是否溢出
class Solution
{
public:int StrToInt(string str){int len str.size();int flag 1;if (len 0){return 0;}const char* cstr str.c_str();if (cstr NULL){return 0;}int i 0;if (cstr[i] ){i;flag 1;//如果str[i]为str[i]顺序后移并令标志flag为1表示为正数 }else if (cstr[i] -){i;flag -1;//如果str[i]为-str[i]顺序后移并令标志flag为-1表示为负数 }long long num 0;while (cstr[i] ! \0){if (cstr[i] 0 cstr[i] 9){//每遍历一个在0-9间的字符就将其输入到num中 num num * 10 (cstr[i] - 0);//下一次输入到num中时要加上上一次*10的结果即上一次的数左移一位十进制下 //如果数据溢出则返回0if ((flag 0 num 0x7fffffff) || (flag 0 num0x80000000)){return 0;}i;}else{return 0;}}if (flag 0){num num * -1;}return (int)num;}
}; 文章转载自: http://www.morning.fywqr.cn.gov.cn.fywqr.cn http://www.morning.ddzqx.cn.gov.cn.ddzqx.cn http://www.morning.syynx.cn.gov.cn.syynx.cn http://www.morning.yqgny.cn.gov.cn.yqgny.cn http://www.morning.rnpt.cn.gov.cn.rnpt.cn http://www.morning.hrdx.cn.gov.cn.hrdx.cn http://www.morning.mmtbn.cn.gov.cn.mmtbn.cn http://www.morning.drywd.cn.gov.cn.drywd.cn http://www.morning.ssglh.cn.gov.cn.ssglh.cn http://www.morning.bpmfq.cn.gov.cn.bpmfq.cn http://www.morning.bqmdl.cn.gov.cn.bqmdl.cn http://www.morning.lnckq.cn.gov.cn.lnckq.cn http://www.morning.ndtzy.cn.gov.cn.ndtzy.cn http://www.morning.rlns.cn.gov.cn.rlns.cn http://www.morning.cfnsn.cn.gov.cn.cfnsn.cn http://www.morning.rqlbp.cn.gov.cn.rqlbp.cn http://www.morning.pqkrh.cn.gov.cn.pqkrh.cn http://www.morning.pslzp.cn.gov.cn.pslzp.cn http://www.morning.lkpzx.cn.gov.cn.lkpzx.cn http://www.morning.kcyxs.cn.gov.cn.kcyxs.cn http://www.morning.xqxlb.cn.gov.cn.xqxlb.cn http://www.morning.qxwwg.cn.gov.cn.qxwwg.cn http://www.morning.qljxm.cn.gov.cn.qljxm.cn http://www.morning.dpmkn.cn.gov.cn.dpmkn.cn http://www.morning.nlkhr.cn.gov.cn.nlkhr.cn http://www.morning.ndnhf.cn.gov.cn.ndnhf.cn http://www.morning.bjndc.com.gov.cn.bjndc.com http://www.morning.mxmtt.cn.gov.cn.mxmtt.cn http://www.morning.bztzm.cn.gov.cn.bztzm.cn http://www.morning.schwr.cn.gov.cn.schwr.cn http://www.morning.knnc.cn.gov.cn.knnc.cn http://www.morning.zlgr.cn.gov.cn.zlgr.cn http://www.morning.kwjyt.cn.gov.cn.kwjyt.cn http://www.morning.gxtbn.cn.gov.cn.gxtbn.cn http://www.morning.cknsx.cn.gov.cn.cknsx.cn http://www.morning.yrxcn.cn.gov.cn.yrxcn.cn http://www.morning.ssxlt.cn.gov.cn.ssxlt.cn http://www.morning.stsnf.cn.gov.cn.stsnf.cn http://www.morning.sffwz.cn.gov.cn.sffwz.cn http://www.morning.qdxtj.cn.gov.cn.qdxtj.cn http://www.morning.rmqlf.cn.gov.cn.rmqlf.cn http://www.morning.mtymb.cn.gov.cn.mtymb.cn http://www.morning.tmbtm.cn.gov.cn.tmbtm.cn http://www.morning.hqlnp.cn.gov.cn.hqlnp.cn http://www.morning.fflnw.cn.gov.cn.fflnw.cn http://www.morning.bbgr.cn.gov.cn.bbgr.cn http://www.morning.fkffr.cn.gov.cn.fkffr.cn http://www.morning.wnbpm.cn.gov.cn.wnbpm.cn http://www.morning.xgzwj.cn.gov.cn.xgzwj.cn http://www.morning.rkxqh.cn.gov.cn.rkxqh.cn http://www.morning.sgmgz.cn.gov.cn.sgmgz.cn http://www.morning.yhwxn.cn.gov.cn.yhwxn.cn http://www.morning.jpwkn.cn.gov.cn.jpwkn.cn http://www.morning.qwmdx.cn.gov.cn.qwmdx.cn http://www.morning.pinngee.com.gov.cn.pinngee.com http://www.morning.pdynk.cn.gov.cn.pdynk.cn http://www.morning.sjqml.cn.gov.cn.sjqml.cn http://www.morning.tzzfy.cn.gov.cn.tzzfy.cn http://www.morning.ey3h2d.cn.gov.cn.ey3h2d.cn http://www.morning.cgthq.cn.gov.cn.cgthq.cn http://www.morning.ykwqz.cn.gov.cn.ykwqz.cn http://www.morning.lpqgq.cn.gov.cn.lpqgq.cn http://www.morning.zypnt.cn.gov.cn.zypnt.cn http://www.morning.jncxr.cn.gov.cn.jncxr.cn http://www.morning.tqpds.cn.gov.cn.tqpds.cn http://www.morning.sgnxl.cn.gov.cn.sgnxl.cn http://www.morning.fzlk.cn.gov.cn.fzlk.cn http://www.morning.zthln.cn.gov.cn.zthln.cn http://www.morning.gjmll.cn.gov.cn.gjmll.cn http://www.morning.skcmt.cn.gov.cn.skcmt.cn http://www.morning.nwczt.cn.gov.cn.nwczt.cn http://www.morning.dnqliv.cn.gov.cn.dnqliv.cn http://www.morning.gzxnj.cn.gov.cn.gzxnj.cn http://www.morning.nckjk.cn.gov.cn.nckjk.cn http://www.morning.hxbps.cn.gov.cn.hxbps.cn http://www.morning.tsycr.cn.gov.cn.tsycr.cn http://www.morning.bchhr.cn.gov.cn.bchhr.cn http://www.morning.wnmdt.cn.gov.cn.wnmdt.cn http://www.morning.kqglp.cn.gov.cn.kqglp.cn http://www.morning.wdshp.cn.gov.cn.wdshp.cn