question : i love u ->u love i
analysis:
主要思想是 首先整体逆置句子,然后再寻找句子中每个单词 做逆置。
需要分析的是: 单词的定义?空格如何处理?标点符号?
需要注意的地方就是:在需要知道单词的结尾的时候,需要对字符串最后一个字符进行判断,如果仍然处于单词中,这个时候仍然要结束这个单词,去逆置
1void reverse(char *s,int start,int end)
2{
3 if(s == null || start > end )
4 return;
5 for(int i = start,j = end; i < j;i++,j--)
6 {
7 char temp = s[i];s[i] = s[j];s[j] = temp;
8 }
9}
10 1void reverse_word(char *s)
2{
3 if(s == null)
4 return;
5 int len = strlen(s);
6 reverse(s,0,len-1);
7
8 int flag = 0;// word doesnot begin
9 int i = 0,start = 0,end = 0;
10 while(s[i] != '\0')
11 {
12 if(isalpha(s[i]) && flag == 0)
13 {
14 start = i;
15 flag = 1;
16 }
17 else if(flag == 1 && !isalpha(s[i]))
18 {
19 end = i-1;
20 reverse(s,start,end);
21 flag = 0;
22 }
23 else if(flag == 1 && s[i+1] == '\0')
24 {
25 if(isalpha(s[i]))
26 end = i;
27 else
28 end = i-1;
29 reverse(s,start,end);
30 }
31 i++;
32 }
33
34}
35
sizeof(class)总结下:
如果class为空,那么sizeof(class)=1;
如果class 内有虚函数,则要加上一个指针大小
当然class的data member也是要加上的。。。。
转载水木
误解:inline函数没有单独的函数体,也不能取地址。
inline修饰并不会改变函数的通常语义,仍可通过函数指针调用:
inline void f() {}
void g() {
void (*p)() = f;
p();
}
------------------------------------------------------------------------
误解:inline一定导致代码膨胀
class Foo {
public:
int Bar() { return foo; }
private:
int foo;
};
这样的Foo::Bar inline会让binary变小
------------------------------------------------------------------------
误解: inline函数一定是internal linkage/no linkage的。
inline与函数的linkage无关。inline函数同样可以用static和extern修饰,并具
备同一般函数相同的linkage。标准要求external linkage的inline函数在所有编
译单元中具有相同的地址。external linkage的inline函数内定义的静态变量同
样应在所有编译单元中表现为单一对象,具有相同的地址。
------------------------------------------------------------------------
误解: 如果inline函数包含循环/调用了其他函数/递归调用自己,编译器就无法
将其展开。
某些早期的编译器有这类限制,但对现代编译器来说它们不再是inline展开的障
碍了。
[insert RoachCock's example here]
------------------------------------------------------------------------
误解:inline和virtual不能同时修饰一个函数。
inline和virtual并不冲突。以下程序编译通过。
#include <iostream>
struct A
{
inline virtual void f()
{
std::cout << "inline virtual" << std::endl;
}
};
------------------------------------------------------------------------
误解:virtual函数即使声明为inline,由于是late binding,无法判断实际
调用的版本,编译器也无法展开。
虚函数调用并不总是late binding。
示例:
struct Base
{
virtual void foo(){cout << "Base::foo" << endl;}
};
struct Derived : Base
{
void foo(){cout << "Derived::foo" << endl;}
};
void bar(Base& b)
{
b.foo(); // late binding. if b is a Derived, call Derived::foo
b.Base::foo(); // early binding. inline
Derived d;
d.foo(); // early binding. inline
}
另外,尽管在您的编译器中很可能还没有实现,但即使late binding理论上也是
可以展开的。
从2006年6月1号在无锡南禅市买了《essential c++》之后,发誓要坚持把它给学下去,尽管我每天都在上班,但是我还是利用车上时间,公司少量时间,和晚上的时间,把这本书看完了,自我感觉功力大增,C语言的功底给了我很大的帮助,我不停地上机实践,发现问题,解决问题,收获知识,快速成长,只要自己努力,就一定市可以的。
“作为一个好的学习者,背景不是重点,重要的是,你是否具备正确的学习态度,起步固然可以从轻松小品开始,但如果碰上大部头巨著就退避三舍、逃之夭夭,面对任何技术只求快餐速成,学语言从来不写程序,那就绝对没有成为高手乃至专家的一天”
下一个月的目标,是重读effective c++ ,c++编程用法,c++必知必会,最重要的是上机体会,发现问题,解决问题,积累知识。
这几天没来这里,并不代表我没有看C++,我仍然按计划在进行,也就是今天,我完成了第五章的阅读,剩下的这两天,主要是上机实践,这样周一就可以看第六章,一定要按计划在7月份前高质量把书看完做完。。。
上篇是我写的一个关于matrix的类,实现了任意指定行和列,已经基本的运算“+,-,*”,还有拷贝赋值操作,应该可以满足基本的要求。遇到的问题:
在写拷贝赋值等函数的时候,由于丢掉了 &
matrix& operator=(const matrix &rhs); 结果导致了在析构函数无法正常完成,表现的现象free_dbg这个地方出问题,再者,还有地址无法访问,这个其实是由于没有新开空间,我就直接赋值了,所以出现了这个问题。
在copy assignment operator这个函数的时候,一定要删除掉原来的空间,然后new一个空间,再赋值过去。
在copy constructor的时候,只要new一个就可以了。
这其实都是对于class内有配置动态内存,需要重写这两个函数。。
matrix(const matrix &rhs);
一切还都是计划进行,第四章还剩下一个关于指针函数的问题,明天搞定,然后18号就按计划进入第15章,还是老话:写程序才能发现问题