今天上午老总布置了任务,竟然要我在半个月内完全接手业务,难度好大,没办法,尽量吧
以前都是用VC6.0的环境,从今天起要改用.NET了,竟然还要涉及到STL。My God,这个名词我第一次听说还是一个月前的一本程序员面试宝典上呢,而今竟然就要用到了, 无奈之下只好立刻学习!
编译环境安装完毕,从网上搞了个STL简介,先初窥堂奥吧 ,网址这里贴出来,希望大家也都能从中得到帮助(http://docs.huihoo.com/gnu/linux/stl.html)。
现在我的概念中STL其实和VC、VB里面那些控件是差不多的,都是一些集成好的方法和属性的集合(可能不准确哦,只是我个人现在的理解)。STL就是Standard Template Library,标准模板库,从根本上说,STL是一些“容器”的集合,这些“容器”有list,vector,set,map等,STL也是算法和其他一些组件的集合。STL的目的是标准化组件,这样你就不用重新开发它们了。你可以仅仅使用这些现成的组件。STL现在是C++的一部分,因此不用额外安装什麽。它被内建在你的编译器之内,你可以直接使用。
这里我参考上面的文章用STL的list来做了个小小的程序,来看看到底怎么使用STL?
STL容器可以保存对象,内建对象和类对象。STL算法是标准算法,我们可以把它们应用在那些容器中的对象上。STL iterator就象是容器中指向对象的指针。STL的算法使用iterator在容器上进行操作。Iterator设置算法的边界 ,容器的长度,和其他一些事情。你可以通过调用容器的成员函数begin()来得到一个指向一个容器起始位置的iterator。你可以调用一个容器的 end() 函数来得到过去的最后一个值(就是处理停在那的那个值)。 这就是STL所有的东西,容器、算法、和允许算法工作在容器中的元素上的iterator。 算法以合适、标准的方法操作对象,并可通过iterator得到容器精确的长度。一旦做了这些,它们就在也不会“跑出边界”。 还有一些其他的对这些核心组件类型有功能性增强的组件,例如函数对象。我们将会看到有关这些的例子,现在 ,我们先来看一看STL的list。
我们可以象这样来定义一个STL的list:
#include <string>
#include <list>
using namespace std;
int main (void) {
list<string> Milkshakes;
}
这就行了,你已经定义了一个list。简单吗?list<string> Milkshakes这句是你声明了list<string>模板类 的一个实例,然后就是实例化这个类的一个对象。但是我们别急着做这个。在这一步其实你只需要知道你定义了 一个字符串的list。你需要包含提供STL list类的头文件。
【注意】上述所说的文章中没有using namespace std;语句,而使用STL这一句是必须加上的哦,千万不要生搬硬套,以免走弯路!
现在我们有了一个list,我们可以看实使用它来装东西了。我们将把一个字符串加到这个list里。有一个非常 重要的东西叫做list的值类型。值类型就是list中的对象的类型。在这个例子中,这个list的值类型就是字符串,string , 这是因为这个list用来放字符串。
#include <string>
#include <list>
int main (void) {
list<string> Milkshakes;
Milkshakes.push_back("Chocolate");
Milkshakes.push_back("Strawberry");
Milkshakes.push_front("Lime");
Milkshakes.push_front("Vanilla");
}
We now have a list with four strings in it. The list member function push_back() places an object onto the back of the list. The list member function push_front() puts one on the front. I often push_back() some error messages onto a list, and then push_front() a title on the list so it prints before the error messages. 我们现在有个4个字符串在list中。list的成员函数push_back()把一个对象放到一个list的后面,而 push_front()把对象放到前面。我通常把一些错误信息push_back()到一个list中去,然后push_front()一个标题到list中, 这样它就会在这个错误消息以前打印它了。
我们想要遍历一个list,比如打印一个中的所有对象来看看list上不同操作的结果。要一个元素一个元素的遍历一个list, 我们可以这样做:
#include <iostream>
#include <string>
#include <list>
using namespace std;
int main (void) {
list<string> Milkshakes;
list<string>::iterator MilkshakeIterator;
Milkshakes.push_back("Chocolate");
Milkshakes.push_back("Strawberry");
Milkshakes.push_front("Lime");
Milkshakes.push_front("Vanilla");
// print the milkshakes
Milkshakes.push_front("The Milkshake Menu");
Milkshakes.push_back("*** Thats the end ***");
for (MilkshakeIterator=Milkshakes.begin();
MilkshakeIterator!=Milkshakes.end();
++MilkshakeIterator) {
// dereference the iterator to get the element
cout << *MilkshakeIterator << endl;
}
}
【注意】在写上面这个小程序时我开始没有把iostream包括进来,以致编译时cout出错,后来加入了#include <iostream.h>竟然说找不到iostream.h,我晕!后来一查才知道,要用#include <iostream>。NET中要使用C++的输入输出流(即cin与cout) ,可以用以下两个方法:
方法一:
System::Console::Writeline();
System::Console::Write();
方法二:就是#include <iostream>语句,然后就可以在程序中直接cout和cin了。