将 STL 应用于遗留数组






4.37/5 (11投票s)
2004年3月22日
2分钟阅读

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 强大功能的一种快速而简便的方法。