C++的STL在C#中的应用

这里主要讲几个重要的STL在C#中的应用:vector, map, hash_map, queue, set, stack, list.

 

vector: 在C#中换成了list

  1 using System;

  2 using System.Collections.Generic;

  3 using System.Linq;

  4 using System.Text;

  5 

  6 namespace test2

  7 {

  8     class Program

  9     {

 10         static void Main(string[] args)

 11         {

 12             Person p1 = new Person("zhangsan", 30);

 13             Person p2 = new Person("lisi", 20);

 14             Person p3 = new Person("wangwu", 50);

 15             List<Person> persons = new List<Person>();

 16             persons.Add(p1);

 17             persons.Add(p2);

 18             persons.Add(p3);

 19             //能直接访问index

 20             Console.WriteLine(persons[1].Name);

 21             //sort方法1

 22             persons.Sort();

 23             foreach (Person p in persons)

 24             {

 25                 Console.WriteLine(p.Name);

 26             }

 27             //sort方法2

 28             persons.Sort(NameComparer.Default);

 29             foreach (Person p in persons)

 30             {

 31                 Console.WriteLine(p.Name);

 32             }

 33             //sort方法3

 34             System.Comparison<Person> NameComparison = new System.Comparison<Person>(PersonComparison.Name);

 35             persons.Sort(NameComparison);

 36             foreach (Person p in persons)

 37             {

 38                 Console.WriteLine(p.Name);

 39             }

 40             //search

 41             System.Predicate<Person> MidAgePredicate = new System.Predicate<Person>(PersonPredicate.MidAge);

 42             List<Person> MidAgePersons = persons.FindAll(MidAgePredicate);

 43             foreach (Person p in MidAgePersons)

 44             {

 45                 Console.WriteLine(p.Name);

 46             }

 47             //Persons集合

 48             Persons PersonCol = new Persons();

 49             PersonCol.Add(p1);

 50             PersonCol.Add(p2);

 51             PersonCol.Add(p3);

 52             Console.WriteLine(PersonCol.GetAllNames());

 53             Console.ReadKey();

 54         }

 55     }

 56     class Person : IComparable<Person>

 57     {

 58         private string _name;

 59         private int _age;

 60         public Person(string Name, int Age)

 61         {

 62             this._age = Age;

 63             this._name = Name;

 64         }

 65         public string Name

 66         {

 67             get { return _name; }

 68         }

 69         public int Age

 70         {

 71             get { return _age; }

 72         }

 73         public int CompareTo(Person p)

 74         {

 75             return this.Age - p.Age;

 76         }

 77     }

 78     class NameComparer : IComparer<Person>

 79     {

 80         public static NameComparer Default = new NameComparer();

 81         public int Compare(Person p1, Person p2)

 82         {

 83             return System.Collections.Comparer.Default.Compare(p1.Name, p2.Name);

 84         }

 85     }

 86     class PersonComparison

 87     {

 88         public static int Name(Person p1, Person p2)

 89         {

 90             return System.Collections.Comparer.Default.Compare(p1.Name, p2.Name);

 91         }

 92     }

 93     class PersonPredicate

 94     {

 95         public static bool MidAge(Person p)

 96         {

 97             return p.Age >= 40;

 98         }

 99     }

100     class Persons : List<Person>

101     {

102         public string GetAllNames()

103         {

104             if (this.Count == 0) return "";

105             string val = "";

106             foreach (Person p in this)

107             {

108                 val += p.Name + ",";

109             }

110             return val.Substring(0, val.Length - 1);

111         }

112     }

113 }
View Code

还可以参考http://www.cnblogs.com/yingzhongwen/archive/2013/04/09/3010182.html

list没有赋初值的方法,只能new一个出来,再不停地Add...而数组是有初始值的,但不能给它赋特别的初始值,int的初始值为0,bool为false

List的方法和属性

Capacity  用于获取或设置List可容纳元素的数量。当数量超过容量时,这个值会自动增长。

Count 属性,用于获取数组中当前元素数量

Item( ) 通过指定索引获取或设置元素。对于List类来说,它是一个索引器。

Add( ) 在List中添加一个对象的公有方法

AddRange( ) 公有方法,在List尾部添加实现了ICollection接口的多个元素

BinarySearch( ) 重载的公有方法,用于在排序的List内使用二分查找来定位指定元素.

Clear( ) 在List内移除所有元素

Contains( ) 测试一个元素是否在List内

CopyTo( ) 重载的公有方法,把一个List拷贝到一维数组内, 注意这里是List.CopyTo(int[]); List之间的深拷贝只能是List<int> tmp = new List<int>(tmp1.ToArray());

Exists( ) 测试一个元素是否在List内(跟Contains有啥区别。。。)

Find( ) 查找并返回List内的出现的第一个匹配元素

FindAll( ) 查找并返回List内的所有匹配元素

GetEnumerator( ) 重载的公有方法,返回一个用于迭代List的枚举器

Getrange( ) 拷贝指定范围的元素到新的List内

IndexOf( ) 重载的公有方法,查找并返回每一个匹配元素的索引

Insert( ) 在List内插入一个元素, Insert(int index, T tmp);

InsertRange( ) 在List内插入一组元素

LastIndexOf( ) 重载的公有方法,,查找并返回最后一个匹配元素的索引

Remove( ) 移除与指定元素匹配的第一个元素

RemoveAt( ) 移除指定索引的元素

RemoveRange( ) 移除指定范围的元素

Reverse( ) 反转List内元素的顺序

Sort( ) 对List内的元素进行排序

ToArray( ) 把List内的元素拷贝到一个新的数组内

trimToSize( ) 将容量设置为List中元素的实际数目

 

map: 在C#中换成了directory,基本跟map用法差不多

 1             Dictionary<string, string> pList = new Dictionary<string, string>();

 2             pList.Add("zhangsan", "40");

 3             string s = "d";

 4             pList.TryGetValue("zhangsan", out s);

 5             Console.WriteLine("{0}", s);

 6             if (pList.ContainsKey("zhangsan"))

 7                 Console.WriteLine("pList containsKey zhangsan");

 8             if (pList.ContainsValue("40"))

 9                 Console.WriteLine("pList containsValue 40");

10             Console.WriteLine(pList.Count);

11             foreach (var dic in pList)

12             {

13                 Console.WriteLine("Output : Key : {0}, Value : {1}", dic.Key, dic.Value);

14             }

15             pList.Remove("zhangsan");
View Code

 

hash_map: C#没有这个东西

 

queue:C#还是叫Queue

 1 using System;

 2 using System.Collections.Generic;

 3 using System.Linq;

 4 using System.Text;

 5 

 6 namespace test2

 7 {

 8     class Program

 9     {

10         static void Main(string[] args)

11         {

12             Queue<string> que = new Queue<string>();

13             que.Enqueue("zhangsan");

14             que.Enqueue("lisi");

15             que.Enqueue("wangwu");

16             Console.WriteLine("Count: {0}", que.Count);

17             Console.WriteLine("Queue values: ");

18             PrintValues(que);

19             Console.WriteLine("(Dequeue)\t{0}", que.Dequeue());

20             Console.WriteLine("Queue values: ");

21             PrintValues(que);

22             Console.WriteLine("(peek)  \t{0}", que.Peek());

23             Console.WriteLine("Queue values: ");

24             PrintValues(que);

25             Console.ReadKey();

26         }

27         public static void PrintValues(IEnumerable<string> myCollection)

28         {

29             foreach (Object obj in myCollection)

30             {

31                 Console.WriteLine("   {0}", obj);

32             }

33         }

34     }

35 }
View Code

 

set: C#叫HashSet

 1 using System;

 2 using System.Collections.Generic;

 3 using System.Linq;

 4 using System.Text;

 5 

 6 namespace test2

 7 {

 8     class Program

 9     {

10         static void Main(string[] args)

11         {

12             HashSet<string> set = new HashSet<string>();

13             set.Add("zhangsan");

14             set.Add("lisi");

15             set.Add("wangwu");

16             if (set.Contains("zhangsan"))

17                 Console.WriteLine("set contans zhangsan");

18             Console.WriteLine(set.Count);

19             set.Remove("zhangsan");

20             if (set.Contains("zhangsan"))

21                 Console.WriteLine("set contans zhangsan");

22             Console.WriteLine(set.Count);

23             foreach (var s in set)

24                 Console.WriteLine("{0}", s);

25             set.Clear();

26             Console.WriteLine(set.Count);

27         }

28     }

29 }
View Code

 

stack: C#还是叫stack(遵照set)

stack.Push();

stack.Pop();

stack.Peek(); 

 

list: C#就是list

 

string:

string是readonly的,要修改某一个字符就得先转成char[],再转回来

char[] sh = str.ToArray();

sh[3] = 'a';

str = new string(sh);

string s = "hello world";

1. bool b1 = s.Contains("hello");

2. 定位

2.1 IndexOf/LastIndexOf

int IndexOf(char value);

int IndexOf(char value, int startIndex);

int IndexOf(char value, int startIndex, int count);

int IndexOf(string value);

int IndexOf(string value, int startIndex);

int IndexOf(string value, int startIndex, int count);

2.2 IndexOfAny/LastIndexOfAny

int IndexOfAny(char[] anyof);

int IndexOfAny(char[] anyof, int startIndex);

int IndexOfAny(char[] anyof, int startIndex, int count);

LastIndexOfAny跟2.1类似

 

最后补充一下数组

int[,] f = new int[3, 5];  //声明一个3行5列的int数组

int m = f.GetLength(0);  //获得行数

int n = f.GetLength(1);  //获得列数

 二维数组在函数里以一维作为参数时,C#没有办法用f[i]这种形式,只能传进f和行号,这确实比较麻烦

你可能感兴趣的:(C++)