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

建设旅游网站的价值渭南网站建设

建设旅游网站的价值,渭南网站建设,重庆网站建设快忻科技,国内比较好的wordpress主题string底层是一个是字符数组 为了跟库里的string区别,所以定义一个命名空间将类string包含 一、构造 1.构造函数 注意:将char*传给const char*是范围缩小,因此只能1:1构造一个 strlen遇到nullptr解引用会报错,因此…

string底层是一个是字符数组

为了跟库里的string区别,所以定义一个命名空间将类string包含

一、构造

1.构造函数

注意:将char*传给const char*是范围缩小,因此只能1:1构造一个

strlen遇到nullptr解引用会报错,因此缺省参数只能设置为" "

string(const char* str = ""):_size(strlen(str))
{if (_size == 0){_capacity = 3;}else{_capacity = _size;}_str = new char[_capacity + 1];strcpy(_str, str);
}

2.拷贝构造

深拷贝:重新开辟一个空间

浅拷贝(值拷贝):拷贝一个指针,指向同一片空间

string(const string& s):_size(s._size),_capacity(s._capacity)
{_str = new char[_capacity + 1];strcpy(_str, s._str);
}

3.析构

内置类型,调用默认成员函数,自定义类型调用默认构造

~string()
{if (_str != NULL){delete[] _str;_str = NULL;}_size = 0;_capacity = 0;
}

4.赋值

赋值运算符也是默认成员函数,如果不写会进行浅拷贝/值拷贝

string& operator=(const string& s)
{_size = s._size;_capacity = s._capacity;delete[] _str;_str = new char[_capacity+1];strcpy(_str, s._str);return *this;
}

二、迭代器

使用typedef 将用iterator代替char*

1.begin

iterator begin()
{return _str;
}

2.end

iterator end()
{return _str + _size;
}

三、修改

1.push_back

void push_back(char c)
{if (_size + 1 > _capacity){reserve(_size + 1);char* tmp = new char[_capacity + 1];strcpy(tmp, _str);delete[] _str;_str = tmp;}_str[_size] = c;_size++;_str[_size] = '\0';
}

2.+=

复用尾插

string& operator+=(char c)
{push_back(c);return *this;
}

3.append

通过reserve类似扩容的操作,扩大了字符串长度的空间,并且在原字符串‘\0’的位置上拷贝str字符串

void append(const char* str)
{size_t len = strlen(str);if (len + _size > _capacity){reserve(len + _size);char* tmp = new char[_capacity + 1];strcpy(tmp, _str);delete[] _str;_str = tmp;}strcpy(_str + _size, str);_size += len;
}

4.clear

void clear()
{_size = 0;_str[0] = '\0';
}

5.swap

void swap(T& a, T& b)
{T tmp = a;a = b;b = tmp;
}
void swap(string& s)
{bit::swap<char*>(_str, s._str);bit::swap<size_t>(_size, s._size);bit::swap<size_t>(_capacity, s._capacity);
}

6.c_str

const char* c_str()const
{const char* tmp = _str;return tmp;
}

四、容量

1.size

	size_t size()const{return _size;}

2.capacity

size_t capacity()const
{return _capacity;
}

3.empty

bool empty()const
{if (_size == 0){return true;}else{return false;}
}

4.resize

分三种情况

n<_size  删除数据

_size<n<_capacity 剩余空间初始化

n>_capacity 扩容+初始化

void resize(size_t n, char c = '\0')
{if (n <= _size){_size = n;_str[n] = '\0';}else{reserve(n);size_t i = _size;while (i < n){_str[i] = c;i++;}_size = n;_str[_size] = '\0';}
}

5.reserve

为防止new失败,所以使用临时变量tmp指向new出来的空间,若new成功,释放旧空间,并将—_str指向新的空间

void reserve(size_t n)
{if (n > _capacity){_capacity = n;char* tmp = new char[_capacity + 1];strcpy(tmp, _str);delete[]_str;_str = tmp;}
}

五、访问

1.[ ]

char& operator[](size_t index)
{return _str[index];
}
const char& operator[](size_t index)const
{return _str[index];
}

2."<,<=,>,>=,==,!="

通过strcmp,比较字符串从头开始字符的ASCII值,再通过复用来实现剩下的

const只能调用const,非const既可以调用非const,也可以调用const

bool operator<(const string& s)
{return (*this >= s);
}
bool operator<=(const string& s)
{return !(*this > s);
}
bool operator>(const string& s)
{return (strcmp(_str, s._str) > 0);
}
bool operator>=(const string& s)
{return (*this == s || *this > s);
}
bool operator==(const string& s)
{return strcmp(_str, s._str) == 0;
}
bool operator!=(const string& s)
{return !(*this==s);
}

3.find

size_t find(char c, size_t pos = 0)const
{while (pos < _size){if (_str[pos] == c){return pos;}pos++;}return npos;
}
size_t find(const char* s, size_t pos = 0)const
{const char* p = strstr(_str, s);if (p != nullptr){return _str - p;}return npos;
}

4.insert

注意size_t类型变量没有负数

string& insert(size_t pos, char c)
{if (_size + 1 > _capacity){reserve(_size + 1);char* tmp = new char[_capacity + 1];strcpy(tmp, _str);delete[]_str;_str = tmp;}size_t end = _size;while (end >= pos){_str[end + 1] = _str[end];;end--;}_str[pos] = c;_size++;_str[_size] = '\0';return *this;
}
string& insert(size_t pos, const char* str)
{size_t len = strlen(str);if (_size + len > _capacity){reserve(_size + len);char* tmp = new char[_capacity + 1];strcpy(tmp, _str);delete[]_str;_str = tmp;}size_t end = _size;while (end >= pos){_str[end + len] = _str[end];end--;}strncpy(_str + pos, str, len);_size += len;return *this;
}

5.erase

pos位置开始删除len个数据

string& erase(size_t pos, size_t len)
{if (len == npos && len + pos > _size){_str[pos] = '\0';}else{while (pos+len<_size){_str[pos] = _str[pos + len];pos++;}_size -= len;_str[_size] = '\0';}return *this;
}

6.流插入<<

ostream& operator<<(ostream& _cout, const bit::string& s)
{for (int i = 0; i < s._size; i++){_cout << s[i] << "";}_cout << endl;return _cout;
}

7.流提取>>

输入多个值,C++规定 空格/换行是值与值之间的区分

istream& operator>>(istream& _cin, bit::string& s)
{s.clear();char ch = _cin.get();char buf[128];int index = 0;while (ch != ' ' && ch != '\n'){buf[index++] = ch;if (index == 127){buf[index] = '\0';s += buf;index = 0;}ch = _cin.get();}if (index != 0){s += buf;}return _cin;
}

http://www.yayakq.cn/news/686277/

相关文章:

  • 母婴会所网站建设学网页制作有什么用
  • 定制网站建设公司排行wordpress 视频
  • 建设银行网站用户名忘了怎么办盐城seo快速排名
  • 国外做任务网站南陵网站建设
  • php网站外包园林专业设计学习网站
  • 怎么看网站有没有被k小程序论坛
  • 设计专业所需网站wordpress相册居中
  • 衡水网站建设公司联系电话网页版微信小程序
  • 长沙有哪些网站建设公司好wordpress菜单不兼容
  • 做阿里巴巴网站口碑包装设计网站是什么样子的
  • 华为手机官方网站登录软文怎么优化网站
  • 开办时 网站建设费 科目百度秒收录的网站
  • 网站开发项目总结报告wordpress如何修改语言设置
  • php个人网站怎么做怎么申请 免费网站
  • 网站建设的原因有什么山西省吕梁市邮政编码
  • 重庆有效的网站推广专业企业网站建设哪家服务好
  • 做本地房产网站台州网站制作开发
  • 网站建设需要多少钱费用深圳移动网站建设公司
  • 动易网站开发的主要技术美橙互联网站建设
  • 网站运行维护方案高碑店建设局网站
  • 什么网站专做衣服龙口网站建设公司报价
  • 网站更改指定字段杭州棋牌软件开发公司
  • 社交模板网站建设东营做网站m0536
  • 房产网站怎么做400电话网站备案各种问题汇总
  • wordpress 通知插件怎么做网站关键词优化
  • 天津医疗行业网站建设dw做的网站有什么缺陷
  • 甘孜州住房城乡建设局网站自适应网站建设软件
  • 哪些网站设计好wordpress图片表单插件
  • 网站建站加盟昆山网站建设义搏
  • 国内哪个网站用wordpress网站存储空间大小