65.9K
CodeProject 正在变化。 阅读更多。
Home

将 STL 应用于遗留数组

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.37/5 (11投票s)

2004年3月22日

2分钟阅读

viewsIcon

46112

解释了如何以最小侵入性将 STL 算法应用于遗留数组。

引言

本文展示了如何将 STL 算法应用于传统数组,而无需进行大量额外工作。我的意思是,无需将数据从传统数组复制到 STL 向量中,或创建自定义迭代器。 在这里,“传统”指的是内置数组或 MFC 的 CArray

动机

促使我写这篇文章的原因是我最近做的一些 C++ 维护编程工作。这段代码大量使用了内置数组,以及一两个 MFC CArray。 当我刚开始使用 STL 算法时,我不知道可以将它们应用于 STL 数据结构之外的任何东西。 这是因为我最初关于 STL 的示例来源是 Visual C++ 的在线帮助,它总是使用 STL 数据结构来说明概念。 后来,我获得了 Bjarne Stroustrup 的《C++ 编程语言》,这本书提供了额外的帮助,然后是 Nicolai Josuttis 的《C++ 标准库》。 这两本书都解释了如何将算法应用于内置数组,但它们没有花太多时间在这上面,而且我第一次阅读时或多或少地错过了这些示例。

此外,我认为我使用基本的 STL 数据结构及其自身的成员函数已经有一段时间了,然后我才学会如何使用通用算法。 而且,当然,由于内置数组没有成员函数,因此操纵它们的问题没有出现。 当我最终发现算法时,我的主要重点是将它们应用于新编写的代码。 在这种情况下,我几乎总是会从 STL 数据结构开始,因此,再次,内置数组的问题没有出现。

内置数组

以下是如何将简单算法应用于内置数组。

#include <iostream>
#include <algorithm>

using namespace std;

// Initialize

int a[] = { 1, 2, 1, 4, 0, 2 };
int count = sizeof(a) / sizeof(a[0]);

cout << "Initial elements\n";

for (int i = 0; i < count; i++)
{
    cout << a[i] << "\t";
}

cout << "\n";

// Find maximum element

int* begin = a;
int* end = a + count;

int* maximum = max_element(begin, end);
cout << "Maximum element = " << *maximum << "\n";

// Sort elements

sort(begin, end);

cout << "Sorted elements\n";

for (i = 0; i < count; i++)
{
    cout << a[i] << "\t";
}

cout << "\n";
    
    

这将输出

Initial elements
1 2 1 4 0 2 
Maximum element = 4
Sorted elements
0 1 1 2 2 4 

MFC CArray

你也可以相当容易地将算法应用于 MFC 的 CArray 类。有一个函数,GetData() ,它返回指向 CArray 中第一个数组元素的指针。 尝试将以下代码添加到,例如,MFC 对话框应用程序的对话框类的 OnInitDialog() 成员中,并在调试器中运行它。

#include <afxtempl.h>
#include <algorithm>

using namespace std;
    
// Initialize
    
CArray<int, int> a;
a.Add(1);
a.Add(2);
a.Add(1);
a.Add(4);
a.Add(0);
a.Add(2);

int count = a.GetSize();

afxDump << "Initial elements\n";

for (int i = 0; i < count; i++)
{
    afxDump << a[i] << "\t";
}

afxDump << "\n";

// Find maximum element

int* begin = a.GetData();
int* end = begin + count;
int* maximum = max_element(begin, end);

afxDump << "Maximum element = " << *maximum << "\n";

// Sort elements

sort(begin, end);

afxDump << "Sorted elements\n";

for (i = 0; i < count; i++)
{
    afxDump << a[i] << "\t";
}

afxDump << "\n";
    

这将输出

Initial elements
1 2 1 4 0 2 
Maximum element = 4
Sorted elements
0 1 1 2 2 4 

我们无法将此技术应用于 CList。为此,我们需要创建一个自定义迭代器。 事实上,我们也应该对 CArray 执行相同的操作。 我相信 CodeGuru 网站上某个地方有一个关于如何执行此操作的示例:http://www.codeguru.com/。 但上述技术提供了一种以最小侵入性方式应用 STL 强大功能的一种快速而简便的方法。

© . All rights reserved.