链式反应
1+1+1+1+1+1+1+...+1=56
"hello "+"world"+"!"="hello world!"
为啥它们能一直加下去?
对于上面两个例子,抽象来说即:
a + b = c
a的类型是 启动类型 ,b的类型是 被启动类型, c的类型是 结果类型
当满足如下要求时可以构成链式反应的条件:
1,启动类型的事物可以和被启动类型的事物结合.
2.结合创造(输出)的类型为结果类型
3.结果类型 = 启动类型
回到第二行:1+1+1+1+1+1+1+...+1=56
我们先提取最前面的一对,即1+1.
可知 1 + 1 = 2,
即:启动类型 +被启动类型=启动类型,
式子化为:2+1+1+1+1+1+...+1=56
依然提取最前面的一对,即2+1
可知 2 + 1 = 3,
即:启动类型 +被启动类型=启动类型,
式子化为:3+1+1+1+1+...+1=56
上面两个例子是启动类型和被启动类型相同的,举个类型不同的:
我有一个B类型的粒子,有一堆A类型的粒子,一个B类型粒子只会与一个A类型粒子结合,生成多个B类型粒子
当我用这个B类型的例子去撞击A类型的粒子,两个粒子结合后, 变为多个B类型的粒子,这些B类型的粒子,它们又去撞击其它的A粒子,产生更多的B类型粒子,直到所有的A类型粒子被消耗光.
这也是std::cout的输出原理
std::ostream& operator<<(std::ostream& cout, Type t){
return cout<<t.Property1<<","<<t.Property2;
}
std::cout<<t1<<t2<<t3<<...<<tn;
利用这一特性,我们还能搞点其它有意思的事情.
比如我有一个字符串,它用逗号将多个人名拼接起来,它长这样:
string s = "张三,李四,王五,赵六,刘七";
我有一个函数,它可以把字符串用特定符号分割
void SplitByDelimeter(std::string parent, std::string delimeter){
//index of the first delimeter
int ifd = parent.find(delimeter);
if(ifd<0){
return;
}
std::string before = parent.substr(0,ifd);
std::string after = parent.substr(ifd + delimeter.length(), parent.length()-ifd-delimeter.length());
}
我把s输入到函数,before就会等于"张三",after就等于"李四,王五,赵六,刘七"
我想继续分割after,那就:
void SplitByDelimeter(std::string parent, std::string delimeter){
//index of first delimeter
int ifd = parent.find(delimeter);
if(ifd<0){
return;
}
std::string before = parent.substr(0,ifd);
std::string after = parent.substr(ifd + delimeter.length(), parent.length()-ifd-delimeter.length());
SplitByDelimeter(after, delimeter);
}
好像在一层一层的深入,如果有个东西能贯通每一层的话,那它就能拿到每层分割后的结果.
那就加一个可以抵达每一层的容器:
void SplitByDelimeter(std::string parent, std::string delimeter, std::vector<std::string>& container){
//index of first delimeter
int ifd = parent.find(delimeter);
if(ifd<0){
container.push_back(parent);
return;
}
std::string before = parent.substr(0,ifd);
container.push_back(before);
std::string after = parent.substr(ifd + delimeter.length(), parent.length()-ifd-delimeter.length());
SplitByDelimeter(after, delimeter, container);
}
这种二和为一,一分为二的现象,导致链式反应的发生.