c/c++ 重载运算符 ==和!=的重载
程序员文章站
2023-12-28 19:49:04
重载运算符 ==和!=的重载 问题:假如有一个类似于vector的类,这个类只能存放string,当有2个这个类的对象时,如何比较这2个对象。 自己重载==和!= 代码(重载==,!=) c++ include include include class string_vector{ friend ......
重载运算符 ==和!=的重载
问题:假如有一个类似于vector的类,这个类只能存放string,当有2个这个类的对象时,如何比较这2个对象。
自己重载==和!=
代码(重载==,!=)
#include <iostream> #include <memory> #include <string> class string_vector{ friend bool operator==(const string_vector&, const string_vector&); friend bool operator!=(const string_vector&, const string_vector&); public: string_vector(): elements(nullptr), first_free(nullptr), cap(nullptr){} string_vector(const string_vector&); string_vector& operator=(const string_vector&); string_vector(std::initializer_list<std::string>); ~string_vector(); void push_back(const std::string&); size_t size() const { return first_free - elements; }; size_t capacity() const { return cap - elements; } void resize(size_t, std::string&); void resize(size_t); void reserve(size_t); std::string* begin() const{return elements;} std::string* end() const{return first_free;} private: static std::allocator<std::string> alloc; //static const int a = 10; void chk_n_alloc(){ if(size() == capacity()) reallocate(); } std::pair<std::string*, std::string*> alloc_n_copy (const std::string* b, const std::string* e); void free(); void reallocate(); void reallocate(size_t); std::string* elements;//指向第一个元素的指针 std::string* first_free;//指向最后一个元素的下一个位置的指针 std::string* cap;//指向vector空间最后一个位置的下一个位置的指针 }; //必须在类的外面再定义一次,否则后面使用alloc的地方,编译不过 std::allocator<std::string> string_vector::alloc; std::pair<std::string*, std::string*> string_vector::alloc_n_copy (const std::string* b, const std::string* e){ auto data = alloc.allocate(e - b); return {data, std::uninitialized_copy(b, e, data)}; } void string_vector::push_back(const std::string& s){ chk_n_alloc(); alloc.construct(first_free++, s); } void string_vector::free(){ if(elements){ for(auto p = first_free; p != elements;) alloc.destroy(--p); alloc.deallocate(elements, cap - elements); } } string_vector::string_vector(const string_vector& s){ auto newdata = alloc_n_copy(s.begin(), s.end()); elements = newdata.first; first_free = cap = newdata.second; } string_vector::string_vector(std::initializer_list<std::string> sl){ auto newdata = alloc_n_copy(sl.begin(), sl.end()); elements = newdata.first; first_free = cap = newdata.second; } string_vector::~string_vector(){ free(); } string_vector& string_vector::operator=(const string_vector& rhs){ auto newdata = alloc_n_copy(rhs.begin(), rhs.end()); free(); elements = newdata.first; first_free = cap = newdata.second; return *this; } void string_vector::reallocate(){ auto newcap = size() ? size() * 2 : 1; auto newdata = alloc.allocate(newcap); auto dest = newdata; auto elem = elements; for(size_t i = 0; i != size(); ++i){ alloc.construct(dest++, std::move(*elem++)); } free(); elements = newdata; first_free = dest; cap = elements + newcap; } void string_vector::reallocate(size_t sz){ auto newcap = sz * 2; auto newdata = alloc.allocate(newcap); auto dest = newdata; auto elem = elements; for(size_t i = 0; i != size(); ++i){ alloc.construct(dest++, std::move(*elem++)); } free(); elements = newdata; first_free = dest; cap = elements + newcap; } void string_vector::reserve(size_t sz){ if(sz > capacity()){ reallocate(sz); } } void string_vector::resize(size_t sz){ size_t cap = capacity(); if(sz > cap){ reallocate(sz); for(size_t i = size();i != sz; ++i){ //调用string的默认构造方法 alloc.construct(first_free++); } } else if(sz < size()){ for(size_t i = sz;i != size(); ++i){ //调用string的西沟函数 alloc.destroy(--first_free); } } } void string_vector::resize(size_t sz, std::string& s){ size_t cap = capacity(); if(sz > cap){ reallocate(sz); for(size_t i = size();i != sz; ++i){ //调用string的非默认构造方法 alloc.construct(first_free++, s); } } else if(sz < size()){ for(size_t i = sz;i != size(); ++i){ //调用string的西沟函数 alloc.destroy(--first_free); } } } bool operator==(const string_vector& lhs, const string_vector& rhs){ if(lhs.size() == rhs.size()){ auto *p1 = lhs.elements; auto *p2 = rhs.elements; while(p1 != lhs.first_free){ if(*p1++ != *p2++){ return false; } } return true; }else{ return false; } } bool operator!=(const string_vector& lhs, const string_vector& rhs){ return !operator==(lhs, rhs); } int main(){ string_vector sv1{"112"}; string_vector sv2{"11"}; if(sv1 != sv2){ std::cout << "!=" << std::endl; } else{ std::cout << "==" << std::endl; } }
c/c++ 学习互助qq群:877684253
本人微信:xiaoshitou5854
推荐阅读
-
c/c++ 重载运算符 ==和!=的重载
-
求教,QQ和YY那个弹窗结构是用什么语言结构?html?xml?结合的是c c++ 还是?_html/css_WEB-ITnose
-
C和C++中经const修饰的常量、常变量和普通变量的区别
-
Tensorflow 在c++上的编译和遇到的一些问题
-
C++析构函数重载
-
21.C++- "++"操作符重载、隐式转换之explicit关键字、类的类型转换函数
-
《写给大忙人看的Swift》 ——swift和object-c的关系会步C与C++的后尘吗?
-
【基于C++和Python的Opencv3学习笔记之基本图形的绘制】
-
为什么在美国的cs编程入门课大多有java和python。而在国内首先学习的语言是c/c++?
-
深入解析C++和JAVA的字符串