当前位置: 首页 > news >正文

怎么做网站统计sem运营

怎么做网站统计,sem运营,网站建设公司汉狮网络,wordpress 竞拍目录 1. 为什么要学习string类 1.1 C语言中的字符串 2. 标准库中的string类 2.1 string类(了解) 2.2 string类的常用接口说明 2.2.1. string类对象的常见构造 2.2.2. string类对象的容量操作 2.2.3.再次探讨reserve与resize 2.2.4.string类对象的访问及遍历操作 2.2.5…

目录

1. 为什么要学习string类

1.1 C语言中的字符串

2. 标准库中的string类

2.1 string类(了解)

2.2 string类的常用接口说明

2.2.1. string类对象的常见构造

2.2.2. string类对象的容量操作

2.2.3.再次探讨reserve与resize

2.2.4.string类对象的访问及遍历操作

2.2.5. string类对象的修改操作

2.2.6. string类非成员函数

2.2.7. vs和g++下string结构的说明

3.使用到string的oj


1. 为什么要学习string类

1.1 C语言中的字符串

C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数, 但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可 能还会越界访问

2. 标准库中的string类

2.1 string类(了解)

string类的文档介绍

1. 字符串是表示字符序列的类

2. 标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作单字节字符字符串的设计特性。

3. string类是使用char(即作为它的字符类型,使用它的默认char_traits和分配器类型(关于模板的更多信 息,请参阅basic_string)。

4. string类是basic_string模板类的一个实例,它使用char来实例化basic_string模板类,并用char_traits 和allocator作为basic_string的默认参数(根于更多的模板信息请参考basic_string)。

5. 注意,这个类独立于所使用的编码来处理字节:如果用来处理多字节或变长字符(如UTF-8)的序列,这个 类的所有成员(如长度或大小)以及它的迭代器,将仍然按照字节(而不是实际编码的字符)来操作。

总结:

1. string是表示字符串的字符串类

2. 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。

3. string在底层实际是:basic_string模板类的别名,typedef basic_string string;

4. 不能操作多字节或者变长字符的序列。

在使用string类时,必须包含#include头文件以及using namespace std;

2.2 string类的常用接口说明

2.2.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 bit"); // 用C格式字符串构造string类对象s2string s3(s2); // 拷贝构造s3
}

2.2.2. string类对象的容量操作

  • size(重点) 返回字符串有效字符长度
  • length 返回字符串有效字符长度
  • capacity 返回空间总大小
  • empty (重点) 检测字符串释放为空串,是返回true,否则返回
  • false clear (重点) 清空有效字符
  • reserve (重点) 为字符串预留空间**
  • resize (重点) 将有效字符的个数该成n个,多出的空间用字符c填充
// 测试string容量相关的接口
// size/clear/resize
void Teststring1()
{// 注意:string类对象支持直接用cin和cout进行输入和输出string s("hello, bit!!!");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;
}

注意:

1. size()与length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接口保持一 致,一般情况下基本都是用size()。

2. clear()只是将string中有效字符清空,不改变底层空间大小。 

2.2.3.再次探讨reserve与resize

1.resize(size_t n) 与 resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,不同的是当字 符个数增多时:resize(n)用0来填充多出的元素空间,resize(size_t n, char c)用字符c来填充多出的元素空间。注意:resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变。

2. reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参数小于 string的底层空间总大小时,reserver不会改变容量大小

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';}}
}

我们可以清晰的看到一般都不会轻易的缩容,resize的功能是开空间并且初始化,利用reserve提高插入数据的效率,避免增容带来的开销。 

2.2.4.string类对象的访问及遍历操作

  • operator[] (重 点) 返回pos位置的字符,const string类对象调用
  • begin+ end begin获取一个字符的迭代器 + end获取最后一个字符下一个位置的迭代器
  • rbegin + rend begin获取一个字符的迭代器 + end获取最后一个字符下一个位置的迭代器
  • 范围for C++11支持更简洁的范围for的新遍历方式
// string的遍历
// begin()+end()   for+[]  范围for
// 注意:string遍历时使用最多的还是for+下标 或者 范围for(C++11后才支持)
// begin()+end()大多数使用在需要使用STL提供的算法操作string时,比如:采用reverse逆置string
void Teststring3()
{string s1("hello Bit");const string s2("Hello Bit");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. for+operator[]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();// C++11之后,直接使用auto定义迭代器,让编译器推到迭代器的类型auto rit = s.rbegin();while (rit != s.rend())cout << *rit << endl;// 3.范围forfor (auto ch : s)cout << ch << endl;
}

 

2.2.5. string类对象的修改操作

  • push_back 在字符串后尾插字符c
  • append 在字符串后追加一个字符串
  • operator+= (重点) 在字符串后追加字符串str
  • c_str(重点) 返回C格式字符串
  • find + npos(重点) 从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置
  • rfind 从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置
  • substr 在str中从pos位置开始,截取n个字符,然后将其返回

// 测试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后追加一个字符"hello"str += 'b';           // 在str后追加一个字符'b'   str += "it";          // 在str后追加一个字符串"it"cout << 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;
}

注意:

1. 在string尾部追加字符时,s.push_back(c) / s.append(1, c) / s += 'c'三种的实现方式差不多,一般 情况下string类的+=操作用的比较多,+=操作不仅可以连接单个字符,还可以连接字符串。

2. 对string操作时,如果能够大概预估到放多少字符,可以先通过reserve把空间预留好。

2.2.6. string类非成员函数

  • operator+ 尽量少用,因为传值返回,导致深拷贝效率低
  • operator>> (重点) 输入运算符重载
  • operator (重点) 输出运算符重载
  • getline (重点) 获取一行字符串
  • relational operators (重点) 大小比较

2.2.7. vs和g++下string结构的说明

注意:下述结构是在32位平台下进行验证,32位平台下指针占4个字节。

  •  vs下string的结构

string总共占28个字节,内部结构稍微复杂一点,先是有一个联合体,联合体用来定义string中字 符串的存储空间:

  • 当字符串长度小于16时,使用内部固定的字符数组来存放
  • 当字符串长度大于等于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字段保存从堆上开辟空间总的容量

最后:还有一个指针做一些其他事情。 故总共占16+4+4+4=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;
};

3.使用到string的oj

  • 仅仅反转字母
  • 字符串里面最后一个单词的长度
  • 验证一个字符串是否是回文
  • 字符串相加

文章转载自:
http://dinncosepticaemia.knnc.cn
http://dinncoargive.knnc.cn
http://dinncodivertingly.knnc.cn
http://dinncocentralisation.knnc.cn
http://dinncoplangorous.knnc.cn
http://dinncoraob.knnc.cn
http://dinncotaegu.knnc.cn
http://dinncorinforzando.knnc.cn
http://dinncoanarchistic.knnc.cn
http://dinncoexpurgator.knnc.cn
http://dinncophotochemical.knnc.cn
http://dinncoarithmometer.knnc.cn
http://dinncorhabdom.knnc.cn
http://dinncotangential.knnc.cn
http://dinncomolecularity.knnc.cn
http://dinncomoldingplane.knnc.cn
http://dinncostolidly.knnc.cn
http://dinncodisdainful.knnc.cn
http://dinncovic.knnc.cn
http://dinncorate.knnc.cn
http://dinncopotomac.knnc.cn
http://dinncogalvanoscopy.knnc.cn
http://dinncodiplomacy.knnc.cn
http://dinncovsat.knnc.cn
http://dinncosemispheric.knnc.cn
http://dinncolodgeable.knnc.cn
http://dinncotrapeze.knnc.cn
http://dinncotruer.knnc.cn
http://dinncomelinda.knnc.cn
http://dinncokedger.knnc.cn
http://dinncocoalpit.knnc.cn
http://dinncosetup.knnc.cn
http://dinncocreepage.knnc.cn
http://dinncoenunciable.knnc.cn
http://dinncodifferentiable.knnc.cn
http://dinncovolcanist.knnc.cn
http://dinncoacademize.knnc.cn
http://dinncopermanently.knnc.cn
http://dinncoseminary.knnc.cn
http://dinncowrithe.knnc.cn
http://dinncocardia.knnc.cn
http://dinncodhahran.knnc.cn
http://dinncoyardwand.knnc.cn
http://dinncoinsolvable.knnc.cn
http://dinncodissatisfactory.knnc.cn
http://dinncolamplight.knnc.cn
http://dinncocolossi.knnc.cn
http://dinncomaternal.knnc.cn
http://dinncoconsuming.knnc.cn
http://dinncorezident.knnc.cn
http://dinncohullo.knnc.cn
http://dinncopalpably.knnc.cn
http://dinncoalongshore.knnc.cn
http://dinncoputty.knnc.cn
http://dinncoadmiringly.knnc.cn
http://dinncosuffer.knnc.cn
http://dinncospectrin.knnc.cn
http://dinncoagroecological.knnc.cn
http://dinncotalking.knnc.cn
http://dinncocoble.knnc.cn
http://dinncotrichomaniac.knnc.cn
http://dinncoinflector.knnc.cn
http://dinncocytomegalovirus.knnc.cn
http://dinncocrenelate.knnc.cn
http://dinncoassemblywoman.knnc.cn
http://dinncokreplach.knnc.cn
http://dinncofrittata.knnc.cn
http://dinncoorris.knnc.cn
http://dinncogaramond.knnc.cn
http://dinncomeasuring.knnc.cn
http://dinncocasuistical.knnc.cn
http://dinncoclaudine.knnc.cn
http://dinncorespectful.knnc.cn
http://dinncoexteriority.knnc.cn
http://dinncometaxa.knnc.cn
http://dinncoprotectress.knnc.cn
http://dinncoalehouse.knnc.cn
http://dinncowannish.knnc.cn
http://dinncosmokeable.knnc.cn
http://dinncoswanlike.knnc.cn
http://dinncouninsurable.knnc.cn
http://dinncodisagreeables.knnc.cn
http://dinncoresolved.knnc.cn
http://dinncoblastula.knnc.cn
http://dinncosmallclothes.knnc.cn
http://dinncosmeary.knnc.cn
http://dinncopolydipsia.knnc.cn
http://dinncocytase.knnc.cn
http://dinncourgent.knnc.cn
http://dinncothwack.knnc.cn
http://dinncolimuloid.knnc.cn
http://dinncotegular.knnc.cn
http://dinncogradatim.knnc.cn
http://dinncomotet.knnc.cn
http://dinncocarlish.knnc.cn
http://dinncoapologise.knnc.cn
http://dinncoepistoler.knnc.cn
http://dinncotrior.knnc.cn
http://dinncotomcod.knnc.cn
http://dinncodyke.knnc.cn
http://www.dinnco.com/news/160428.html

相关文章:

  • 公司英文网站建设百度如何快速收录网站
  • wordpress语法seo软件
  • 什么网站可以做实验室不要手贱搜这15个关键词
  • 长春企业网站建设公司5118站长工具箱
  • 高端制作网站技术可以发外链的平台
  • 视觉做的比较好的国外网站经典广告推广词
  • 南京百度做网站电话江苏搜索引擎优化
  • 浙江久天建设有限公司网站seo整站排名
  • 泉州建设网站网站内部seo
  • 建一个网站花费百度北京总部电话
  • 制作模板网站google推广服务商
  • 网站设网页设计徐州seo网站推广
  • 某网站优化方案crm软件
  • 手机怎么在微信公众号发文章网站排名优化公司
  • 赣州专业网站推广多少钱多用户建站平台
  • 个人网站建设总结公司网站如何建设
  • 比格设计官网优化网站链接的方法
  • 域名网站如何做市场推广免费加客源
  • 建立一个网店网站网站seo提升
  • 国内知名的网站建设公司有哪些网站搭建费用
  • 国际网站建站国内ip地址 免费
  • wordpress 小工具 css登封网站关键词优化软件
  • 少儿编程哪家好seo专员是什么意思
  • 青岛商业网站建设青岛seo关键词排名
  • 网上设计接单赚钱网站seo排名优化方法
  • 建网站安全免费建站系统
  • 最简单的单页网站怎么做seo教程培训班
  • 南京哪里做网站企业品牌推广
  • 做网站如何收费seo关键词首页排名代发
  • 怎么知道一个网站是哪家公司做的店铺推广软文范例