怎么做网站广告代理商国外有哪些优秀的网站
news/
2025/10/2 2:21:37/
文章来源:
怎么做网站广告代理商,国外有哪些优秀的网站,淘宝网站的建设目的是什么意思,网站建设系统chi系统一#xff1a;Cstring类的由来 在C语言中#xff0c;字符串是以\0结尾的一些字符的集合#xff0c;为了操作方便#xff0c;C标准库中提供了一些str系列的库函数#xff0c;但是这些库函数与字符串是分离开的#xff0c;不太符合OOP的思想#xff0c;而且底层空间需要用…一Cstring类的由来 在C语言中字符串是以\0结尾的一些字符的集合为了操作方便C标准库中提供了一些str系列的库函数但是这些库函数与字符串是分离开的不太符合OOP的思想而且底层空间需要用户自己管理稍不留神可能还会越界访问。 C中对于string的定义为typedef basic_string string;
也就是说C中的string类是一个泛型类由模板而实例化的一个标准类本质上不是一个标准数据类型。
至于为什么不直接用String标准数据类型而用类是因为编码
每个国家的语言不同 比如说英语使用26个英文字母基本就能表述所有的单词 但是对于中文的字符呢是不是就要用其他编码方式啊比如说utf-8
补充
string是表示字符串的字符串类该类的接口与常规容器的接口基本相同再添加了一些专门用来操作string的常规操作。string在底层实际是basic_string模板类的别名typedef basic_stringchar, char_traits, allocator string;不能操作多字节或者变长字符的序列。在使用string类时必须包含#include头文件以及using namespace std
二.string类常用接口
1. string类对象的常见构造
(constructor)函数名称功能说明string() 重点构造空的string类对象即空字符串string(const char* s) 重点用C-string来构造string类对象string(size_t n, char c)string类对象中包含n个字符cstring(const strings) 重点拷贝构造函数
代码演示 void test_string1()
{string s1; //构造空string对象string s2(hello); //使用C-string字符串构造string对象s2string s3(10, x); //使用十个x字符构造string对象s3string s4(s2); //拷贝构造
}
2. string类对象的容量操作
函数名称功能说明size重点返回字符串有效字符长度length返回字符串有效字符长度capacity返回空间总大小empty 重点检测字符串释放为空串是返回true否则返回falseclear 重点清空有效字符reserve 重点为字符串预留空间resize 重点将有效字符的个数该成n个多出的空间用字符c填充
注意
size() 与 length() 方法底层实现原理完全相同引入size()的原因是为了与其他容器的接口保持一致一般情况下基本都是用size()。 clear()只是将string中有效字符清空不改变底层空间大小resize(size_t n) 与 resize(size_t n, char c) 都是将字符串中有效字符个数改变到n个不同的是当字符个数增多时resize(n)用0来填充多出的元素空间resize(size_t n, char c)用字符c来填充多出的元素空间。注意resize在改变元素个数时如果是将元素个数增多可能会改变底层容量的大小如果是将元素个数减少底层空间总大小不变。reserve(size_t res_arg0)为string预留空间不改变有效元素个数当reserve的参数小于string的底层空间总大小时reserver不会改变容量大小。
补充
resize与reverse是为了在已知数据大小的情况下避免多次扩容减小开销 代码演示
void test_string2()
{string s1(hello); //size与length都为 5cout s1.size() endl;cout s1.length() endl;cout s1.capacity() endl;//clear仅会改变有效字符个数size会被置为0不会改变容量大小//capacity为字符串的容量会自行扩容s1.clear();cout s1.size() endl; cout s1.capacity() endl;//将字符串有效个数变为10个多出来的用x赋值,若有效个数超过容量大小,capacity还会扩容//此时字符窜内容为“xxxxxxxxxx”s1.resize(10, x);cout s1.size() endl;cout s1 endl;//将capacity改变为128//注意编译器不一定会正好将capacity置为128这得看编译器的扩容机制s1.reserve(128);cout s1.capacity() endl;
}
3. string类对象的访问及遍历操作
函数名称功能说明operator[ ] 返回pos位置的字符const string类对象调用begin endbegin获取一个字符的迭代器 end获取最后一个字符下一个位置的迭代器rbegin rendbegin获取一个字符的迭代器 end获取最后一个字符下一个位置的迭代器范围forC11支持更简洁的范围for的新遍历方式 void test_string3()
{string s1(hello world!);// 3种遍历方式// 需要注意的以下三种方式除了遍历string对象还可以遍历是修改string中的字符// 另外以下三种方式对于string而言第一种使用最多//第一种operator[]for (size_t i 0; i s1.size(); i){cout s1[i] ;}cout endl;//第二种正向迭代器string::iterator it s1.begin();while (it ! s1.end()){cout *it ;it;}cout endl;//反向迭代器// string::reverse_iterator rit s.rbegin();// C11之后直接使用auto定义迭代器让编译器推到迭代器的类型//反向打印auto rit s1.rbegin();while (rit ! s1.rend()){cout *rit ;rit;}cout endl;//第三种范围forfor (auto s : s1){cout s ;}cout endl;
}
4. string类对象的修改操作
函数名称功能说明push_back在字符串后尾插字符cappend在字符串后追加一个字符串operator (重点) 在字符串后追加字符串str c_str(重点)返回C格式字符串find npos(重点)从字符串pos位置开始往后找字符c返回该字符在字符串中的位置rfind从字符串pos位置开始往前找字符c返回该字符在字符串中的位置substr在str中从pos位置开始截取n个字符然后将其返回insert(size_t pos,const string str)在pos位置后插入str对象的字符串insert(size_t pos,const char* str)在pos位置后插入C类型的字符串insert(size_t pos,char ch)在pos位置后插入字符cherase(size_t pos,size_t lennpos)删除pos位置后len个字符若len为缺省则删除pos位置后的所有字符
void TestString4()
{string str;str.push_back( ); // 在str后插入空格str.append(hello); // 在str后追加一个字符hellostr b; // 在str后追加一个字符bstr it; // 在str后追加一个字符串itcout str endl;cout str.c_str() endl; // 以C语言的方式打印字符串// 获取file的后缀string file1(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;
}
}注意
在string尾部追加字符时s.push_back(c) / s.append(1, c) / s c三种的实现方式差不多一般情况下string类的操作用的比较多操作不仅可以连接单个字符还可以连接字符串。对string操作时如果能够大概预估到放多少字符可以先通过reserve把空间预留好这样可以减少多次扩容带来的开销
5. string类非成员函数
函数功能说明operator尽量少用因为传值返回导致深拷贝效率低operator 重点输入运算符重载operator 重点输出运算符重载getline 重点获取一行字符串relational operators重点大小比较 三模拟实现string类及其常用接口
namespace zyq
{class string{public:typedef char* iterator;typedef const char* const_iterator;//构造函数string(){_str new char[1];_size 0;_capacity 0;_str[0] \0;}string(const char* str):_size(strlen(str)), _capacity(strlen(str)), _str(new char[strlen(str) 1]){strcpy(_str, str);}//析构函数~string(){delete[] _str;_size 0;_capacity 0;}//拷贝构造//旧版本拷贝构造/*string(const string s){_str new char[s._capacity 1];strcpy(_str, s._str);_size s._size;_capacity s._capacity;}*///新版本拷贝构造string(const string s){string tmp(s._str);swap(tmp);}size_t size()const{return _size;}size_t capacity()const{return _capacity;}//遍历char* c_str(){return _str;}char operator[](size_t pos){assert(pos _size);return _str[pos];}const char operator[](size_t pos) const{assert(pos _size);return _str[pos];}iterator begin(){return _str;}iterator end(){return _str _size;}const_iterator begin() const{return _str;}const_iterator end() const{return _str _size;}//修改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 c){if (_size _capacity){size_t newcapacity _capacity 0 ? 4 : 2 * _capacity;reserve(newcapacity);}_str[_size] c;_size;_str[_size] \0;}void append(const char* str){size_t len strlen(str);if (_size len _capacity){reserve(_capacity len);}strcpy(_str _size, str);_size len;}string operator(char ch){push_back(ch);return *this;}string operator(const char* str){append(str);return *this;}void insert(size_t pos, char ch){assert(pos _size);if (_size _capacity){size_t newcapacity _capacity 0 ? 4 : 2 * _capacity;reserve(newcapacity);}size_t end _size 1;while (end pos){_str[end] _str[end - 1];end--;}_str[pos] ch;_size;}void insert(size_t pos, const char* str){assert(pos _size);size_t len strlen(str);if (_size len _capacity){reserve(_size len);}size_t end _size len;while (end pos len){_str[end] _str[end - len];--end;}strncpy(_str pos, str, len);_size len;}void erase(size_t pos, size_t len npos){assert(pos _size);//len_size-1 这样写可以防止溢出if (len npos || len _size - pos){_str[pos] \0;_size pos;}else{strcpy(_str pos, _str pos len);_size - len;}}void resize(size_t n, char c \0){if (n _capacity){reserve(n);for (size_t i _size; i n; i){_str[i] c;}_str[n] \0;_size n;}else{_size n;_str[n] \0;}}void clear(){_size 0;_str[0] \0;}void swap(string s){std::swap(_size, s._size);std::swap(_capacity, s._capacity);std::swap(_str, s._str);}size_t find(char ch,size_t pos0) const{assert(pos _size);for (size_t i pos; i _size; i){if (_str[i] ch)return i;}return npos;}size_t find(const char* str, size_t pos 0) const{assert(pos _size);char* ret strstr(_str, str);if (ret){return ret - _str;}return npos;}string operator(const string s){string tmp(s._str);swap(tmp);return *this;}bool operator(const string s) const{return strcmp(_str, s._str) 0;}bool operator(const string s) const{return strcmp(_str, s._str) 0;}bool operator(const string s) const{return *thiss||*thiss;}bool operator(const string s) const{return !(*thiss);}bool operator(const string s) const{return !(*thiss);}private:char* _str;size_t _size;size_t _capacity;
public:static const size_t npos;
};const size_t string::npos -1;void swap(string s1, string s2)
{s1.swap(s2);
}ostream operator(ostream out, const string s)
{for (auto ch : s){out ch;}return out;
}istream operator(istream in, string s)
{s.clear();char ch;ch in.get();char ret[128];int i 0;while (ch ! ch ! \n){ret[i] ch;if (i 127){ret[127] \0;s ret;i 0;}ch in.get();}if (i 0){ret[i] \0;s ret;}return in;
}istream getline(istream in, string s)
{s.clear();char ch;ch in.get();char ret[128];int i 0;while ( ch ! \n){ret[i] ch;if (i 127){ret[127] \0;s ret;i 0;}ch in.get();}if (i 0){ret[i] \0;s ret;}return in;
}}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/924501.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!