(原創) 我的VS2008之旅[1] : STL/CLR (.NET) (C++/CLI) (STL) (C/C++)

Abstract
VS2008最讓我有興趣的,首推LINQ,其次就是STL/CLR和Lambda了,LINQ在博客園討論的人已經很多,所以我將VS2008之旅首站駛往STL/CLR。

Introduction
我是先學C#,然後才學C++。C++讓我最癡迷的首推STL,其次則為泛型template。C++/CLI在VS2005中,template保留了大部分ISO C++的功能,如template template parameter,partial specialization,nontype template parameter等,使的大部分泛型技術如Policy-based Design,Traits等得以實現。而STL在C++/CLI雖然可用,但僅限於native type,而managed type則無福消受。MS曾宣稱要將STL在VS2005移植到.net,但可惜跳票了。在千呼萬喚中,總算在VS2008發表了STL/CLR,這是STL移植到.net的版本,可以使用managed type。

STL/CLR
使用STL/CLR的方法很簡單
1.referece Microsoft.VisualC.STLCLR.dll
2.include new header for STL/CLR
  如vector : #include <cliext/vector>
    泛型算法:#include <cliext/algorithm>
3.namespace從std改成cliext

Example
一個很簡單的需求,List<int>包含了1,2,1,3四筆數據,希望將所有的1用4取代,也就是希望結果為4,2,4,3。

ISO C++

ContractedBlock.gif ExpandedBlockStart.gif
ExpandedBlockStart.gifContractedBlock.gif/**//* 
InBlock.gif(C) OOMusou 2006 
http://oomusou.cnblogs.com
InBlock.gif
InBlock.gifFilename    : GenericAlgo_replace.cpp
InBlock.gifCompiler    : Visual C++ 8.0 / ISO C++
InBlock.gifDescription : Demo how to use replace() algorithm
InBlock.gifRelease     : 04/19/2006 1.0
ExpandedBlockEnd.gif
*/

None.gif#include 
<iostream>
None.gif#include 
<vector>
None.gif#include 
<algorithm>
None.gif
None.gif
using namespace std;
None.gif
ExpandedBlockStart.gifContractedBlock.gif
int main() dot.gif{
InBlock.gif  vector
<int> ivec;
InBlock.gif  ivec.push_back(
1);
InBlock.gif  ivec.push_back(
2);
InBlock.gif  ivec.push_back(
1);
InBlock.gif  ivec.push_back(
3);
InBlock.gif  
InBlock.gif  replace(ivec.begin(), ivec.end(), 
14);
InBlock.gif  
InBlock.gif  copy(ivec.begin(), ivec.end(), ostream_iterator
<int>(cout, "\n"));
ExpandedBlockEnd.gif}


執行結果

None.gif 4
None.gif
2
None.gif
4
None.gif
3


16行

None.gif vector < int >  ivec;


是STL的vector container,類似.net的List<T>。

22行

None.gif replace(ivec.begin(), ivec.end(),  1 4 );


為STL提供的『泛型算法』,將vector中所有的1替換為4。


C++/CLI 2

ContractedBlock.gif ExpandedBlockStart.gif
ExpandedBlockStart.gifContractedBlock.gif/**//* 
InBlock.gif(C) OOMusou 2007 
http://oomusou.cnblogs.com
InBlock.gif
InBlock.gifFilename    : GenericAlgo_replace.cpp
InBlock.gifCompiler    : Visual C++ 9.0 / C++/CLI 2.0 / .NET 3.5
InBlock.gifDescription : Demo how to use STL/CLR generic algorithm : replace
InBlock.gifRelease     : 08/07/2007 1.0
ExpandedBlockEnd.gif
*/

None.gif#include 
"stdafx.h"
None.gif#include 
<cliext/vector>    // STL/CLR vector 
None.gif
#include <cliext/algorithm> // STL/CLR algorithm
None.gif

None.gif
using namespace System;
None.gif
using namespace cliext;     // STL/CLR namespace
None.gif

ExpandedBlockStart.gifContractedBlock.gif
int main()  dot.gif{
InBlock.gif  vector
<int> ivec;
InBlock.gif  ivec.push_back(
1);
InBlock.gif  ivec.push_back(
2);
InBlock.gif  ivec.push_back(
1);
InBlock.gif  ivec.push_back(
3);
InBlock.gif  
InBlock.gif  
// generic algorithm
InBlock.gif
  replace(ivec.begin(), ivec.end(), 14);
InBlock.gif  
InBlock.gif  
for each(int n in ivec) 
InBlock.gif    Console::WriteLine(n);
ExpandedBlockEnd.gif}


執行結果

None.gif 4
None.gif
2
None.gif
4
None.gif
3


10、11行

None.gif #include  < cliext / vector >      //  STL/CLR vector 
None.gif
#include  < cliext / algorithm >   //  STL/CLR algorithm


為STL/CLR另外擴充的header。

14行

None.gif using   namespace  cliext;      //  STL/CLR namespace


將原本namespace從std改成cliext。

17行

None.gif vector < int >  ivec;


一樣可以使用STL的vector。

24行

None.gif replace(ivec.begin(), ivec.end(),  1 4 );


感動吧!!一樣可以使用STL『泛型算法』:replace()。

Conclusion
當然這個範例使用了vector<int>,並不能真正看出STL/CLR的威力,STL/CLR真正的強大是用在managed type上。本範例主要是展現透過reference新的assembly和include new header files,new namespace,即可簡單的使用.net平台的STL/CLR,除了讓你更簡單的將以前使用STL的代碼移植到.net,也可繼續使用STL這個強大的泛型框架。

Remark
由於VS2008尚未正式推出,目前僅能用Orcas Beta2加以測試,測試中發現若乖乖的在Project中加入

None.gif Microsoft.VisualC.STLCLR


這個reference,並無法compile成功,會出現

None.gif could not find assembly 'Microsoft.VisualC.STLCLR.dll': please specify the assembly search path using /AI or by setting the LIBPATH environment variable


錯誤訊息,我的解決方式是將

None.gif C:\Program Files\Reference Assemblies\Microsoft\Framework\v3 .5 \Microsoft.VisualC.STLCLR.dll


複製到自己的project目錄下,然後reference這個assembly,如此則可正常執行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值