Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstring>
- #include <vector>
- using namespace std;
- class String{
- int _size;
- char * _str;
- public:
- String();
- String(const char *);
- String(const String&);
- ~String();
- String& operator =(const String&);
- String& operator =(const char*);
- void operator -=(const char*);
- void operator -=(const String&);
- void operator +=(const char*);
- void operator +=(const String&);
- vector<int> allPos(const char*);
- int removeStr(const char*);
- void add(const char*);
- int getSize();
- char* getStr();
- };
- vector<int> String::allPos(const char* str){
- vector<int> v; int len = strlen(str);
- for (int i = 0, j = 0; i < _size; ++i){
- if ( _str[i] == str[j] ){
- j++;
- if ( j == len ) {
- v.push_back(i-j+1);
- --i;
- }
- } else j = 0;
- }
- return v;
- }
- void String::operator +=(const char* str){
- add(str);
- }
- void String::operator +=(const String& str){
- add(str._str);
- }
- void String::add(const char* str){
- _size += strlen(str);
- char* temp = new char[_size+1];
- strcpy(temp,_str);
- strcat(temp, str);
- temp[_size] = '\0';
- delete [] _str;
- _str = temp;
- }
- void String::operator -=(const char* str){
- removeStr(str);
- }
- void String::operator -=(const String& str){
- removeStr(str._str);
- }
- int String::removeStr(const char * str){
- auto v = allPos(str);
- for(int i = v.size()-1, len = strlen(str); i >= 0; --i){
- _size -= len;
- for(int j = v[i]; j < _size; j++){
- _str[j]=_str[j+len];
- }
- }
- if ( v.size() != 0 ) {
- char* temp = new char[_size+1];
- strncpy(temp, _str, _size);
- temp[_size] = '\0';
- delete [] _str;
- _str = temp;
- }
- return v.size();
- }
- int String::getSize(){return _size;}
- char* String::getStr(){return _str;}
- String::String(){
- _size = 0;
- _str = 0;
- }
- String::String(const char* str){
- if (!str){
- _size = 0; _str = 0;
- } else {
- _size = strlen (str);
- _str = new char [_size +1];
- strcpy(_str, str);
- }
- }
- String::String(const String& str){
- _size = str._size;
- if ( !str._str ){
- _str = 0;
- } else {
- _str = new char[_size +1];
- strcpy(_str, str._str);
- }
- }
- String::~String(){
- delete [] _str;
- }
- String& String::operator=( const char * str ){
- if ( ! str ) {
- _size = 0;
- delete [] _str;
- _str = 0;
- } else {
- _size = strlen( str );
- delete [] _str;
- _str = new char[ _size + 1 ];
- strcpy( _str, str );
- }
- return *this;
- }
- String& String::operator=( const String & str)
- {
- if ( this != & str) {
- delete [] _str;
- _size = str._size;
- if ( ! str._str )
- _str = 0;
- else {
- _str = new char[ _size + 1 ];
- strcpy( _str, str._str );
- }
- }
- return *this;
- }
- int main(){
- String s1("hello");
- String s2("_world");
- for (int i = 0; i < 10; ++i)
- s1 += s2;
- cout<< "s1 = "<<s1.getStr()<<endl;
- cout<< "size s1 = " << s1.getSize()<<endl;
- s1 -= "wor";
- cout<< s1.getStr()<<endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement