模擬實現string類的增刪查改
//string.h 標頭檔案函式介面的宣告以及變數的宣告部分
#ifndef __String__
#define __String__
#include <iostream>
#include <assert.h>
using namespace std;
class String
{
public:
friend ostream & operator <<(ostream& os, const String& s);
String(const char *s = "");
String(const String &s );
~ String();
size_t Capacity(const char *s);
char& operator[] (size_t pos);
const char& String::operator[](size_t pos)const;
String& operator+= (const String& str);
String& operator+= (const char* s);
String& operator+= (char c);
void Push_Back(char c);
String& Erase(size_t pos , size_t len );
String Substr(size_t pos , size_t len ) const;
String& operator= (const String& s);
String& Insert(size_t pos, const String& str, size_t Subpos, size_t Sublen);
int Find(const char *s ) const;
private:
size_t _size; //用來表示字串的長度
size_t _capacity; //用來表示所開闢的動態記憶體的大小
char *_str;
};
#endif // __String__
//String.cpp 函式的實現部分
#include "String.h"
ostream & operator <<(ostream& os, const String& s)
{
os << s._str;
return os;
}
String::String(const char *s )
:_capacity(1)
,_str(new char[Capacity(s)])
{
strcpy(_str, s);
_size = strlen(_str);
}
String::String(const String &s)
{
_str = new char[Capacity(s._str)+1];
strcpy(_str, s._str);
_size = strlen(_str);
_capacity = s._capacity;
}
String::~String()
{
if (_str != NULL)
{
delete[] _str;
_str = NULL;
_capacity = _size = 0;
cout << "~String()" << endl;
}
}
char& String::operator[](size_t pos) //改
{
assert(pos < _size);
return _str[pos];
}
const char& String::operator[](size_t pos)const
//在成員函式後加const,const修飾this指標所指向的物件,也就是保證呼叫這個
//const成員函式的物件在函式內不會被改變。
{
assert(pos < _size);
return _str[pos];
}
String& String::operator+= (const String& str)
{
this->operator+=(str._str);
return *this;
}
String& String::operator+= (const char* s)
{
_str = (char*)realloc(_str, Capacity(s));
strcpy(_str + _size, s);
_size = strlen(_str);
return *this;
}
String& String::operator+= (char c)
{
char *tmp = &c;
char *s = tmp;
*(++tmp) ='\0';
this->operator+=(s);
return *this;
}
void String::Push_Back(char c)
{
this->operator+=(c);
}
String& String::Erase(size_t pos, size_t len)
//從指定結點開始刪除到指定長度
{
assert(pos < _size);
if ((pos == _size) || (len == 0))
//不刪除元素或者刪除'\0'或者其之後的元素
{
return *this;
}
else if ((_str + pos + len)<(_str + _size))
//_size+_str剛好指向'\0',刪除的資料未超過字串長度
{
//挪動資料
while (*(_str+pos+len))
{
*(_str + pos) = *(_str + pos + len);
pos++;
}
*(pos + _str) = *(_str + pos + len);
_size = strlen(_str);
return *this;
}
else
{
*(pos + _str) = *(_size + _str);
_size = strlen(_str);
return *this;
}
}
String String::Substr(size_t pos, size_t len) const
//從某個結點擷取多長的字串,是為了防止定義為const的String類的物件被修改
{
assert(pos < _size);
String tmp;
char *cur = _str;
while ((*(_str + pos) !='\0') && (len != 0)&&(*cur!='\0'))
{
tmp += *(_str + pos);
pos++;
len--;
cur++;
}
return tmp;
}
String& String::operator= (const String& s)
{
_str = new char[Capacity(s._str)];
strcpy(_str, s._str);
_size = strlen(_str);
return *this;
}
String& String::Insert(size_t pos, const String& str, size_t Subpos, size_t Sublen)
//指定結點,插入指定String物件的指定位置開始的指定長度字串
//注意使用指標訪問陣列元素和下標訪問陣列元素之間的聯絡和區別
//注意無符號數和有符號數之間的運算會發生隱式型別提升
{
assert(pos < _size);
String s=str.Substr(Subpos,Sublen);
//開闢空間
_str = (char*)realloc(_str,Capacity(s._str)*sizeof(char));
size_t end = strlen(_str)+strlen(s._str);
size_t count = Sublen;
//挪動資料
if (pos == _size ) //從'/0'位置處插入字串
{
return *this += s;
}
else
{
//挪出Sublen個空間
while (count)
{
if ((int)_size > (int)pos-1)
{
*(_str + end) = *(_str + _size);
}
_size--;
end--;
count--;
}
//插入資料
count = s._size;
char *cur = s._str;
while (count)
{
*(_str + pos) = *(cur);
cur++;
pos++;
count--;
}
return *this;
}
}
int String::Find(const char *s) const
{
char *cur1 = _str;
const char *cur2 = s;
size_t pos = 0;
while (cur1)
{
//abcde cd
while (*cur1 == *cur2)
{
cur1++;
cur2++;
}
if (*cur2 == '\0')
{
return pos;
}
//ab abde
else if (*cur1 == '\0'&&*cur2 != '\0')
{
return -1;
}
else
{
pos++;
cur2 = s;
cur1++;
}
}
return -1;
}
size_t String::Capacity(const char *s)
{
_capacity += strlen(s) ; //需要多大容量就增大多少容量
return _capacity;
}
//test.cpp部分測試用例,想測試哪部分功能放開哪部分程式碼註釋
#include "String.h"
int main()
{
//構造
// String s("1234");
//cout << s << endl;
//更改
//s[3] = '2';
//cout << s << endl;
//cout << s[3] << endl;
//const String s1("1234");
//cout << s1 << endl;
//實現+=操作符的過載
//String s2("56");
//s += s2;
//cout << s << endl;
//s += 'c';
//cout << s << endl;
//尾插
//s.Push_Back('s');
//cout << s << endl;
//從指定結點開始刪除到指定長度
//String s4("123456");
//cout << s4<< endl;
//s4.Erase(5, 8);
//cout << s4 << endl;
//從某個結點擷取多長的字串
// String s5(s4.Substr(1, 2));
// s5 = s1;
// cout << s5 << endl;
//指定結點,插入指定String物件的指定位置開始的指定長度字串
//String s1("abcde ");
//String s2("fghjk");
//s1.Insert(6, s2, 3, 5);
//cout << s1 << endl;
//string s1("abcde ");
//string s2("fghjk");
//s1.insert(6, s2, 3, 5);//abcjkde
//找指定字串
//String s1("abcdef");
//cout<<s1.Find("hg")<<endl;
//String s1("abcd");
//s1[1] = 'a';
//cout << s1 << endl;
return 0;
}
相關推薦
C++ 模擬String類增刪查改
String是C++中的重要型別,程式設計師在C++面試中經常會遇到關於String的細節問題,甚至要求當場實現這個類。只是由於時間關係,可能只要求實現建構函式、解構函式、拷貝建構函式等關鍵部分。 String的實現涉及很多C++的基礎知識、記憶體控制及異常處
模擬實現string類的增刪查改
//string.h 標頭檔案函式介面的宣告以及變數的宣告部分 #ifndef __String__ #define __String__ #include <iostream> #include <assert.h> using
Spring Boot集成ElasticSearch實現簡單的增刪查改接口
java.net tin ID request exce 有一個 port client water SpringBoot集成ElasticSearch pom.xml文件中,依賴的各jar包版本如下: <parent> <groupId>o
django與mysql實現簡單的增刪查改
模型定義 from django.db import models class Grades(models.Model): g_name = models.CharField(max_length=20) create_date = models.DateTimeField()
SSM整合系列之 實現物件的增刪查改(CRUD)操作
本文將詳細介紹SSM整合後通過Mybatis實現物件的增刪查改 1.根據Mybatis逆向工程生產實體類,Mapper(Dao),Sql 我自己實現了一個專案,並且帶有自定義註釋, 專案git地址:https://github.com/gitcaiqing/mybatis_generat
簡單的用c3p0和dbutils實現的資料庫增刪查改
import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.d
java--easyUI+struts+JSP實現簡單的增刪查改
<!DOCTYPE html> <html> <head> <title>emp.html</title> <meta name="keywords" content="keyword1,keywor
模擬實現String類
String類模擬實現: #include <iostream> #include <assert.h> #include <string.h> using namespace std; class String { p
jdbc實現簡單的增刪查改(preparedstatement)
上一篇部落格講到statement容易被sql注入…preparedstatment會對sql語句進行預處理,相對而言比較安全…. 下面我用preparedstatement進行簡單的增刪查改操作的原始碼…. public class JDBCTest2
資料結構——c實現連結串列增刪查改
在資料結構中,順序表和連結串列的增刪查改是基礎的知識,下邊是我學習連結串列的一些心得。連結串列的增刪查改。(後附完整程式碼實現)尾插:(思路:先建立一個新的結點,讓連結串列遍歷到最後一個結點,讓最後一個節點的next指向下一個newNode即可)程式碼實現://尾插一個元素到
儲存過程實現基本的增刪查改
三個表結構: 不廢話直接上程式碼 use Text --資料庫名 if exists (select name from sysobjects where name ='up_getallstudents' and type ='p') drop pr
模擬實現String類----傳統寫法
面試時經常會遇到一道題,就是寫一個簡單的String類,很多人不假思索的就給出了下面這樣的寫法class String { String(char* str) :_str(new char[str
Node.js+Navicat for MySQL實現的簡單增刪查改
前提準備: 電腦上必須裝有伺服器環境,Navicat for MySQL(我用的是這款MySQL,可隨意),Node環境 效果如圖所示: 原始碼地址: GitHub:https://github.com/xue-shuai/Add-Del-Query-Resive 碼雲: h
模擬實現string 增刪查改 比較大小
要求: 模擬實現c++庫函式裡面string的部分功能,實現增刪查改,比較預算符的過載 #ifndef __MySTRING_H__ #define __MYSTRING_H__ #define _CRT_SECURE_NO_DEPRECATE 1 #include&l
利用Java針對MySql封裝的jdbc框架類 Util 增刪查改原始碼實現
先貼程式碼: 1 package com.hongli.util; 2 import java.lang.reflect.Field; 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 import java
數據庫表增刪查改幫助類
ram pro 行數 lec 方法 取值 del ado.net sele 1.目的 使用ADO.NET操作連接Sqlserver數據庫,增刪改查數據表. 2.要求 傳入SQL語句和參數,得到結果集或字典集 3.實現辦法 封裝ado.net對象的參數化
Python學習筆記_05:使用Flask+MySQL實現用戶登陸註冊以及增刪查改操作
英文博客 註冊頁面 con 實現 sof 來源 doc 學習過程 microsoft 前言:本文代碼參考自兩篇英文博客,具體來源點擊文末代碼鏈接中文檔說明。 運行效果: 首頁: 註冊頁面: 登陸界面: 管理員登陸後界面: 添加、刪除、修改和查詢員工所
Vue.js——基於$.ajax實現數據的跨域增刪查改
-a serialize 復古 不可 部署 gis 地址 實體 完成 概述 之前我們學習了Vue.js的一些基礎知識,以及如何開發一個組件,然而那些示例的數據都是local的。在實際的應用中,幾乎90%的數據是來源於服務端的,前端和服務端之間的數據交互一般是通過ajax請求
JDBC課程4--使用PreparedStatement進行增刪查改, JDBCTools新增對應的的功能,模擬SQL注入
主要內容: 熟悉了使用PreparedStatement的優勢,沒有使用封裝和使用封裝的方法進行實現了; 以及JDBCTools新增update_sql(String sql,Object...args) 和query_sql(String sql,Object...args)兩個功能模組,分別實
JDBC終章- 使用 DBUtils實現增刪查改- C3P0Utils資料來源/QueryRunner runner連線資料來源並執行sql
JDBC終章- 使用 DBUtils實現增刪查改 1.資料庫結構 Create Table CREATE TABLE `user` ( `id` int(3) NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL, `pas