C++11里头的thread初探

C++11标准给了很多“终于等到了”的功能,其中一项就是线程类 <thread> ,有朝一日终于可以减少操作系统相关了,隔壁J家笑而不语。

 

用法真是简单多了,最简单的一种如下:

上面程序的输出:

cpp11_thread

当然由于我的函数里定义的不是原子操作,所以cout的时候就混杂了~

所以可以用到 <mutex> 类里面的互斥量来解决一下,比如这样

然后我们可以看到,输出不会绕在一起了~当然还是无序的,哈哈

cpp11_mutex

 

查文档的时候注意到,竟然还有死锁检测相关的exception可能会抛出,有点良心的…这几天好好研究一下~

 

C++类型转换符 static_cast, dynamic_cast, const_cast

“cast”一词在英文里有“浇铸”的意思,还是挺形象的。

1.static_cast

可以看做是利用一个原始值构建一个临时对象,并再设定初始值的时候使用类型转换。

例如:

2.dynamic_cast

将多态类型(polymorphic type)成员向下转换为其对应的静态类型成员。这个cast是在运行时实时检验的,因此可以用来检测某个指针指向的对象到底是不是XXX类的。

当参数是个引用,并且类别转换失败的时候,会抛出bad_cast异常哦。

3.const_cast

去除某个对象的const修饰作用,也可以拿来去除volatile修饰作用。

 

C++异常处理,stack unwinding

这篇文章的内容摘自《C++标准程序库》2.2.3节

C++标准程序库可以在不污染函数接口的情况下处理异常。如果你遇到一个意外情况,可以跑出异常来停止后续流程,例如:

其中throw开始了stack unwinding过程,也就是说,他将使得退离任何函数区段时的行为像以return语句返回一样,然而程序却不会跳转到任何地点。对于所有被声明与某区段——而该区段却因程序异常而退离——的局部对象而言,会调用它的析构函数stack unwinding的动作会持续到退出main()或被某个catch子句捕捉并处理了异常为止。

异常对象(exception objects)其实就是一般类或基本类的对象,可以是int,string类型的对象,也可以是某个模板类对象。

 

1065. A+B and C (64bit) (20)

http://www.patest.cn/contests/pat-a-practise/1065


 

原题如下

Given three integers A, B and C in [-263, 263], you are supposed to tell whether A+B > C.

Input Specification:

The first line of the input gives the positive number of test cases, T (<=10). Then T test cases follow, each consists of a single line containing three integers A, B and C, separated by single spaces.

Output Specification:

For each test case, output in one line “Case #X: true” if A+B>C, or “Case #X: false” otherwise, where X is the case number (starting from 1).

Sample Input:

Sample Output:


 

分析,其实就是自己做加减法进位的问题,需要考虑正负号的细节。

正负数加减法的规则可以参考百度文库,一大堆小学生教材,哈哈~

大概是这样,比较两个数a和b:

  • 最终结果符号的判定:如果|a|>=|b|那么结果的符号与a相同,反之符号与b相同;
  • 数值计算,不管正负号,用绝对值大的那个做操作数1,绝对值小的做操作数2,如果a,b同号做操作数1+操作数2,异号做操作数1操作数2

 

我的代码(好久没写c++,各种复杂,见谅)

其中isBiggerAbs是判断a与b的绝对值大小的,isBigger是判断实际值大小的,swapss是交换元素。

另外0x30是字符’0’的ASCII码来着~输入的时候是按照字符流看待的,计算的时候转换成了数字,然后比较的时候为了和c比方便又转换回去了。

另外给的Sample Input里面那个一长串的就是上限和下限了,加上符号20位足够放。

 


结果

评测结果

时间 结果 得分 题目 语言 用时(ms) 内存(kB) 用户
2月22日 20:46 答案正确 20 1065 C++ (g++ 4.7.2) 1 360

测试点

测试点 结果 用时(ms) 内存(kB) 得分/满分
0 答案正确 1 360 12/12
1 答案正确 1 360 4/4
2 答案正确 1 360 4/4

 

wcstombs转换中文的问题

http://blog.chinaunix.net/uid-1878979-id-2817097.html

在应用中碰到中文的字符串用wcstombs转换后,就成了NULL。查了一些一资料后,发现需要调用setlocale函数。这个是针对Unicode来说的,对于使用多国语言的时候需要使用该函数来定义语种
     setlocale(LC_ALL,””);     //设置本地默认Locale. 或者是setlocale(LC_ALL, “chs”)
wcstombs(dest, source, length);
setlocale(LC_ALL,”C”);     //默认

C#的get和set

初学初学C#,发现跟Java没啥区别:)


//Class
public class TestClass
{
private double _numberA = 0;
public double NubmerA
{
get { return _numberA;}
set { _numberA = value;}
}
}
//Main
public class MainClass
{
public static void Main()
{
TestClass t = new TestClass();
r.NumberA = 123.456; // Derived class property
Console.WriteLine("Number in the derived class is " + d1.NumberA);
}
}

C# override重写与new隐藏的区别

C#比java多一个new隐藏的功能。C# override重写相当于java中没有关键字的方法重写。所以java中方法是没有隐藏功能的。

C# override重写,是指对父类中的虚方法(标记virtual)或抽象方法(标记为abstract)进行重写,实现新的功能,它必须与父类方法的签名完全一致,而且与父类方法的可访问性也必须一致 new隐藏,是指在子类中重新定义一个签名与父类的方法相同的方法,这个方法可以不用new修饰,只是编译时会弹出一个警告信息:如果是有意隐藏,请使用关键字new。

using System;
public class Test
{
public static void Main(String[] args){
A a=new B();
Console.Write(a.getVal()); // 输出:A 虽然实例是B,但是执行的却是A的方法

a=new C();
Console.Write(a.getVal()); // 输出:C 实例是C,而且C重写的A的方法,所以执行C的方法

B b=new B();
Console.Write(b.getVal()); // 输出:B 只有定义和实例都是B,才执行B的方法
}
}
class A
{
// 要允许子类重写,方法必须标识为virtual 或 abstract
public virtual String getVal(){
return "A";
}
}
class B : A
{
// 隐藏父类方法 用new标识,不标识时会出现编译警告,不影响使用
public new String getVal(){
return "B";
}
}
class C : A
{
// 重写方法 必须用override标识
public override String getVal(){
return "C";
}
}

而在Java中,不存在隐藏父类方法这一概念,Java只有重写方法这一概念,同样的代码,在Java中执行和C#中执行截然不同:

class test
{
public static void main(String[] args)
{
A a=new B();
// 输出:B 实例是B,执行的也是B的方法(在C#中,此时应该输出A)
System.out.println(a.getVal());
a=new A();
// 输出:A 只有定义和实例都是A,才执行A的方法
System.out.println(a.getVal());
}
}
class A
{
public String getVal(){
return "A";
}
}
class B extends A
{
public String getVal(){
return "B";
}
}

为什么operator

http://www.cnblogs.com/this-543273659/archive/2011/09/01/2161574.html

如果是重载双目操作符(即为类的成员函数),就只要设置一个参数作为右侧运算量,而左侧运算量就是对象本身。。。。。。

而 >>  或<< 左侧运算量是 cin或cout 而不是对象本身,所以不满足后面一点。。。。。。。。就只能申明为友元函数了。。。

如果一定要声明为成员函数,只能成为如下的形式:

ostream & operator<<(ostream &output)

{

return output;

}

所以在运用这个<<运算符时就变为这种形式了:data<<cout;

不合符人的习惯。