首页 文章 精选 留言 我的

精选列表

搜索[c/c ],共10000篇文章
优秀的个人博客,低调大师

C++策略模式

简述 策略模式(Strategy Pattern)定义一系列算法,把它们一个个封装起来,并且使它们可以互相替换。Strategy 可以使算法独立于使用算法的客户端。 简述 模式结构 优缺点 适用场景 案例分析 代码实现 版权所有:一去丶二三里,转载请注明出处:http://blog.csdn.net/liang19890820 模式结构 UML 结构图: Context(环境角色):持有一个对 Strategy 的引用,最终给客户端调用。 Strategy(抽象策略):定义了一个公共接口,让不同的算法以不同的方式来实现。通过这个接口,Context 可以调用不同的算法。 ConcreteStrategy(具体策略):实现 Strategy 定义的接口,提供具体算法的实现。 优缺点 优点: 各自使用封装的算法,可以很容易地引入新的算法来满足相同的接口。 由于实现的是同一个接口,所以策略之间可以自由切换。 Strategy 使客户端能够选择所需的算法,而无需使用 switch/case 或 if/else 语句。 算法的细节完全封装在 Strategy 类中,因此,可以在不影响 Context 类的情况下更改算法的实现。 缺点: 客户端必须知道所有的策略,了解它们之间的区别,以便适时选择恰当的算法。 策略模式将造成产生很多策略类,可以通过使用享元模式在一定程度上减少对象的数量。 适用场景 多个类有不同的表现形式,每种表现形式可以独立成单独的算法。 需要在不同情况下使用不同的算法,以后算法可能还会增加。 对客户端隐藏具体算法的实现细节,彼此完全独立。 案例分析 说走就走的旅行 - 出行方式 每天,我们做着同样的工作,遇见同样的人,吃着同样的食物。。。日复一日,年复一年!当生活陷入重复,想遇到新鲜的人,新鲜的事,为苍白的生活添加一些色彩,何不来一场说走就走的旅行呢! 要出去玩,有很多种出行方式,自行车、公交车、自驾、地铁、火车、飞机。。。如何选择最合适的呢? 如果离家近,又怕堵车,可以骑自行车。 如果离家远,但想省钱,早点出发,可以乘公交车。 如果有车,并且不介意支付停车费,可以选择自驾。 如果没有车,但赶时间,可以乘出租车。 … 这里的每一种出行方式都是一种具体的策略。如何选择,需要基于成本、便利和时间之间的权衡。 代码实现 创建抽象策略 抽象策略由 IStrategy 表示,它提供了一个 Travel() 接口,用于提供出行方式: // strategy.h #ifndef STRATEGY_H #define STRATEGY_H // 出行策略 class IStrategy { public: virtual void Travel() = 0; }; #endif // STRATEGY_H 创建具体策略 有三种具体的策略可供选择,骑自行车、开车、坐火车: // concrete_strategy.h #ifndef CONCRETE_STRATEGY_H #define CONCRETE_STRATEGY_H #include "strategy.h" #include <iostream> // 骑自行车 class BikeStrategy : public IStrategy { public: virtual void Travel() override { std::cout << "Travel by bike" << std::endl; } }; // 开车 class CarStrategy : public IStrategy { public: virtual void Travel() override { std::cout << "Travel by car" << std::endl; } }; // 坐火车 class TrainStrategy : public IStrategy { public: virtual void Travel() override { std::cout << "Travel by train" << std::endl; } }; #endif // CONCRETE_STRATEGY_H 创建环境角色 环境角色对外提供了一个 Travel() 接口,最终由客户端调用。在内部,它最终调用的是 IStrategy 的相应方法: // context.h #ifndef CONTEXT_H #define CONTEXT_H #include "strategy.h" class Context { public: Context(IStrategy *strategy) { m_pStrategy = strategy; } void Travel() { m_pStrategy->Travel(); } private: IStrategy *m_pStrategy; }; #endif // CONTEXT_H 创建客户端 旅程开始,尽情享受吧: // main.cpp #include "context.h" #include "concrete_strategy.h" #ifndef SAFE_DELETE #define SAFE_DELETE(p) { if(p){delete(p); (p)=NULL;} } #endif int main() { // 策略之间可以相互替换 IStrategy *bike = new BikeStrategy(); IStrategy *car = new CarStrategy(); IStrategy *train = new TrainStrategy(); Context *bikeContext = new Context(bike); Context *carContext = new Context(car); Context *trainContext = new Context(train); bikeContext->Travel(); carContext->Travel(); trainContext->Travel(); SAFE_DELETE(bike); SAFE_DELETE(car); SAFE_DELETE(train); SAFE_DELETE(bikeContext); SAFE_DELETE(carContext); SAFE_DELETE(trainContext); getchar(); return 0; } 输出如下: Travel by bike Travel by car Travel by train

优秀的个人博客,低调大师

C#解析JSON

使用开源的类库Newtonsoft.Json(下载地址http://json.codeplex.com/)。下载后添加dll引用就能用。 首先添加引用:using Newtonsoft.Json; 1.Json字符串普通格式解析(常用) string jsonText = "{\"one\":\"西瓜\",\"two\":\"南瓜\"}"; JObject aaa = (JObject)JsonConvert.DeserializeObject(jsonText); string one = aaa["one"].ToString(); string two = aaa["two"].ToString(); 2.Json字符串嵌套格式解析 string jsonText = "{\"fruit\":{\"name\":\"西瓜\",\"name_en\":\"watermelon\"}}"; JObject jo = (JObject)JsonConvert.DeserializeObject(jsonText); string name = jo["fruit"]["name"].ToString(); string name_en = jo["fruit"]["name_en"].ToString(); 3.Json字符串数组格式解析 string jsonArrayText = "[{'a':'a1','b':'b1'},{'a':'a2','b':'b2'}]"; //"[{'a':'a1','b':'b1'}]即使只有一个元素,也需要加上[] string jsonArrayText = "[{\"a\":\"a1\",\"b\":\"b1\"},{\"a\":\"a2\",\"b\":\"b2\"}]"; //上面写法和此写法效果一样 JArray jArray = (JArray)JsonConvert.DeserializeObject(jsonArrayText);//jsonArrayText必须是带[]数组格式字符串 string str = jArray[0]["a"].ToString();

优秀的个人博客,低调大师

C++小例子

#include <iostream> #include <conio.h> int main(){ std::cout<<"Enter two numbers:"<<std::endl; int v1,v2; std::cin>>v1>>v2; int lower,upper; if(v1<=v2){ lower = v1; upper = v2; }else{ lower = v2; upper = v1; } int sum = 0; for(int val = lower;val<=upper;++val){ sum +=val; } std::cout<<"Sum of "<<lower<<"to"<<upper <<" is " <<sum<<std::endl; getch(); return 0; } 输入两个数 计算出,他们之间的和 例如输入1、3 计算1+2+3 本文转自TBHacker博客园博客,原文链接:http://www.cnblogs.com/jiqing9006/p/3723660.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

C++ Exercises(十八)

下了份《46家公司笔试题》做做,好久没接触这些基本知识了,熟悉下 1.完成下列程序 * *.*. *..*..*.. *...*...*...*... *....*....*....*....*.... *.....*.....*.....*.....*.....*..... *......*......*......*......*......*......*...... *.......*.......*.......*.......*.......*.......*.......*....... 复制代码 #include <iostream> using namespace std; const int ROWS = 8;//行数 void DoPrint() { int i,j,k; for(i=1;i<=ROWS;++i) { for(j=1;j<=i;++j) { cout<<"*"; for(k=1;k<=i-1;++k)cout<<"."; } cout<<endl; } } int main() { DoPrint(); return 0; } 复制代码 2.完成程序,实现对数组的降序排序 复制代码 #include <iostream> using namespace std; void printArray(int a[],int n) { for(int i=0;i<n;++i) cout<<a[i]<<"\t"; cout<<endl; } int partion(int a[],int left,int right) {//分割 int temp = a[left]; while (left<right) { while (left<right && a[right]<=temp)--right; a[left] = a[right]; while (left<right && a[left]>=temp)++left; a[right] = a[left]; } a[left] = temp; return left; } void quicksort(int a[],int left,int right) {//快速排序 if(left>=right) return; int pivotloc; pivotloc = partion(a,left,right); quicksort(a,left,pivotloc-1); quicksort(a,pivotloc+1,right); } int main() { int array[] = {45,56,76,234,1,34,23,2,3}; int size = sizeof(array)/sizeof(array[0]); quicksort(array,0,size-1); printArray(array,size); return 0; } 复制代码 3,费波那其数列,1,1,2,3,5……编写程序求第十项。可以用递归,也可以用其他 方法,但要说明你选择的理由。 复制代码 #include <iostream> using namespace std; int Pheponatch(int N) {//返回斐波那契数列第N项 int a[100]={1,1}; for (int i=2;i<N;++i) { a[i] = a[i-1]+a[i-2]; } return a[N-1]; } int main() { cout<<Pheponatch(4)<<endl; return 0; } 复制代码 4,错误原因:指针未初始化, 改正后的代码: 复制代码 #include <stdio.h> #include <malloc.h> #include <iostream> using namespace std; struct TNode { TNode* left; TNode* right; int value; }; TNode* root=NULL; void append(int N) { TNode* NewNode=(TNode *)malloc(sizeof(TNode)); NewNode->value=N; NewNode->left = NULL; NewNode->right = NULL; if(root==NULL) { root=NewNode; return; } else { TNode* temp; temp=root; while((N>=temp->value && temp->left!=NULL) || (N<temp->value && temp->right!=NULL)) { while(N>=temp->value && temp->left!=NULL) temp=temp->left; while(N<temp->value && temp->right!=NULL) temp=temp->right; } if(N>=temp->value) temp->left=NewNode; else temp->right=NewNode; return; } } void printTree(TNode* t) { if (t!=NULL) { printf("%d\n",t->value); printTree(t->left); printTree(t->right); } } int main() { append(63); append(45); append(32); append(77); append(96); append(21); append(17); // Again, 数字任意给出 printTree(root); return 0; } 复制代码 5,设计函数 int atoi(char *s) 。 复制代码 #include <iostream> using namespace std; int my_aoti(char* s) {//字符串转化为整数 int len = strlen(s); int result = 0; for (int i=0;i<len;++i) { result = result*10+s[i]-'0'; } return result; } int main() { char* str = "123"; int num = my_aoti(str); cout<<num<<endl; return 0; } 复制代码 6,实现双向链表删除一个节点P,在节点P 后插入一个节点,写出这两个函数 复制代码 //双向链表节点 struct DbLinkNode { struct DbLinkNode* prev;//前一个节点 struct DbLinkNode* next;//后一个节点 int value; }; bool Delete(DbLinkNode* head,int num) {//在双向链表(带头节点)中删除第一个值为num的节点 if (head->next!=NULL) {//表中有节点存在 struct DbLinkNode* pre = head,p = head->next; while (p!=NULL&&p->value!=num) { pre = p; p = p->next; } if (p==NULL) {//没找到 return false; } else if (p->next==NULL) {//待删除的是最后一个节点 pre->next = NULL; delete p; p = NULL; } else {//待删除的不是最后一个 pre->next = p->next; p->next->prev = pre; delete p; p = NULL; } return true; } else { return false; } } bool Insert(struct DbLinkNode* head,int target,int num) {//在节点target后插入节点num if (head->next!=NULL) {//表中有节点存在 struct DbLinkNode* p = head->next;//指向第一个节点 struct DbLinkNode* newNode = (struct DbLinkNode*)malloc(sizeof(DbLinkNode)); newNode->value = num; newNode->next = NULL; newNode->prev = NULL; while (p!=NULL && p->value!=num) { p = p->next; } if (p==NULL) { free(newNode); newNode = NULL; return false; } else if (p->next==NULL) {//目标节点是最后一个节点,新节点插入为尾节点 p->next = newNode; newNode->prev = p; } else {//目标节点不是最后一个 newNode->next = p->next; p->next->prev = newNode; p->next = newNode; newNode->prev = p; } return true; } else { return false; } } 复制代码 本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2009/02/18/1393441.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

C#函数重载

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Demo { class Program { static int MaxValue(int[] intArray) { int maxVal = intArray[0]; for (int i = 1; i < intArray.Length; i++) { if (intArray[i] > maxVal) { maxVal = intArray[i]; } } return maxVal; } /// <summary> /// 函数重载了 /// </summary> /// <param name="doubleArray"></param> /// <returns></returns> static double MaxValue(double[] doubleArray) { double maxVal = doubleArray[0]; for (int i = 1; i < doubleArray.Length; i++) { if (doubleArray[i] > maxVal) { maxVal = doubleArray[i]; } } return maxVal; } static void Main(string[] args) { int[] myArray = { 1, 3, 5, 8, 2, 10, 9, 100, 40 }; int maxVal = MaxValue(myArray); Console.WriteLine("最大值为:{0}", maxVal); double[] doubleArray = { 1, 3, 5, 8, 2, 10, 9.2, 100.11, 40 }; double maxDoubleVal = MaxValue(doubleArray); Console.WriteLine("最大值为:{0}", maxDoubleVal); Console.ReadKey(); } } } 本文转自TBHacker博客园博客,原文链接:http://www.cnblogs.com/jiqing9006/p/6748280.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

C++ Exercises(十)

1.1 找出第K大的数 方法1: #include <iostream> #include <vector> #include <algorithm> #include <iterator> using namespace std; int main() { int data[] = {3,54,254,52,13,667,234,67,256,78,467,32,65,324,889,34,5}; int len = sizeof(data)/sizeof(int); vector<int> v1(data,data+len); ostream_iterator<int> out(cout," "); copy(v1.begin(),v1.end(),out); cout<<endl; sort(v1.begin(),v1.end(),greater<int>()); copy(v1.begin(),v1.end(),out); cout<<endl; int k; cin>>k; cout<<v1[k-1]<<endl; system("pause"); return 0; } 方法2: #include <iostream> #include <list> #include <algorithm> #include <iterator> using namespace std; class LessThan { public: LessThan(int val):value(val){} ~LessThan(){} bool operator()(int rhs) { return rhs<=value; } private: int value; }; int main() { int data[] = {3,54,254,52,475,667,234,67,256,78,467,32,65,324,889,34,5}; int len = sizeof(data)/sizeof(int); int k; cin>>k; list<int> list1(data,data+k); ostream_iterator<int> out(cout," "); list1.sort(greater<int>());//对前K个数进行排序 list<int>::iterator pos; for(int i=k;i<len;++i) { if(data[i]>list1.back()) {//比最后一个元素大 pos = find_if(list1.begin(),list1.end(),LessThan(data[i]));//找到第一个比要插入值小的元素位置 list1.insert(pos,data[i]);//插入新值 list1.pop_back();//删除最后一个多余的元素 } } copy(list1.begin(),list1.end(),out); cout<<endl; cout<<"第"<<k<<"大的数是: "<<endl; int count = 1; for(pos = list1.begin();pos!=list1.end();++pos,++count) { if(count==k) cout<<(*pos)<<endl; } system("pause"); return 0; } 方法3:用最大堆排序 #include <iostream> #include <vector> #include <algorithm> #include <iterator> using namespace std; template<typename T> void HeapAdjust(vector<T> &v,size_t start,size_t end) { T tmp = v[start]; size_t s = start; for(size_t j=(2*s+1);j<=end;j=(2*j+1)) { if(j<end&&v[j+1]>v[j]) j++; if(tmp<v[j]) { v[s] = v[j]; s = j; } } v[s] = tmp; } template<typename T> void Swap(T &a,T &b) { T tmp = a; a = b; b = tmp; } template<typename T> void HeapSort(vector<T> &v) { int i = 0,j=0; //建最大堆 for(i=(v.size()-1)/2;i>=0;--i) { HeapAdjust(v,i,v.size()-1); } cout<<"输入K:"<<endl; int k; cin>>k; for(i=v.size(),j=k;i>1&&j>0;--i,--j) { Swap(v[0],v[i-1]); if(j==1) { cout<<v[i-1]; } else { HeapAdjust(v,0,i-2); } } } int main() { int data[]={93,5,233,55,3,67,2,67,32,6,89,355}; int len = sizeof(data)/sizeof(int); vector<int> v1(data,data+len); HeapSort(v1); return 0; } 本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2008/03/31/1131862.html,如需转载请自行联系原作者

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册