1. 程式人生 > >模擬實現string類的增刪查改

模擬實現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