9

是否可以为现有的 POD 类型元素数组创建一个类似 STL 的容器,甚至只是一个 STL 样式的迭代器?

例如,假设我有一个整数数组。能够调用一些 STL 函数(例如 find_if、count_if 或直接在此数组上排序)会很方便。

非解决方案:复制整个数组,甚至只是对元素的引用。目标是非常节省内存和时间,同时希望允许使用其他 STL 算法。

4

5 回答 5

22

您可以直接在常规 C 样式数组上调用许多 STL 算法——它们就是为此而设计的。例如,:

int ary[100];
// init ...

std::sort(ary, ary+100); // sorts the array
std::find(ary, ary+100, pred); find some element

我想你会发现大多数东西都如你所愿。

于 2008-10-06T21:01:34.427 回答
5

所有 STL 算法都使用迭代器。
指针是指向对象数组的有效迭代器。

注意结束迭代器必须是数组末尾之后的一个元素。因此,以下代码中的数据+5。

#include <algorithm>
#include <iostream>
#include <iterator>

int main()
{
    int   data[] = {4,3,7,5,8};
    std::sort(data,data+5);

    std::copy(data,data+5,std::ostream_iterator<int>(std::cout,"\t"));
}
于 2008-10-06T21:03:09.930 回答
5

您可以使用内联函数模板,这样您就不必复制数组索引

template <typename T, int I>
inline T * array_begin (T (&t)[I])
{
  return t;
}

template <typename T, int I>
inline T * array_end (T (&t)[I])
{
  return t + I;
}

void foo ()
{
  int array[100];
  std::find (array_begin (array)
      , array_end (array)
      , 10);
}
于 2008-10-06T21:28:58.927 回答
4

您可以使用Boost.Array创建具有 STL 语义的 C++ 数组类型。

使用数组:

int a[100];
for (int i = 0; i < 100; ++i)
    a[i] = 0;

使用 boost.arrays:

boost::array<int,100> a;
for (boost::array<int,100>::iterator i = a.begin(); i != a.end(); ++i)
    *i = 0;

更新:使用 C++11,您现在可以使用std::array.

于 2008-10-06T20:58:36.087 回答
2

指针是迭代器的有效模型:

struct Bob
{ int val; };

bool operator<(const Bob& lhs, const Bob& rhs)
{ return lhs.val < rhs.val; }

// let's do a reverse sort
bool pred(const Bob& lhs, const Bob& rhs)
{ return lhs.val > rhs.val; }

bool isBobNumberTwo(const Bob& bob) { return bob.val == 2; }

int main()
{
    Bob bobs[4]; // ok, so we have 4 bobs!
    const size_t size = sizeof(bobs)/sizeof(Bob);
    bobs[0].val = 1; bobs[1].val = 4; bobs[2].val = 2; bobs[3].val = 3;

    // sort using std::less<Bob> wich uses operator <
    std::sort(bobs, bobs + size);
    std::cout << bobs[0].val << std::endl;
    std::cout << bobs[1].val << std::endl;
    std::cout << bobs[2].val << std::endl;
    std::cout << bobs[3].val << std::endl;

    // sort using pred
    std::sort(bobs, bobs + size, pred);
    std::cout << bobs[0].val << std::endl;
    std::cout << bobs[1].val << std::endl;
    std::cout << bobs[2].val << std::endl;
    std::cout << bobs[3].val << std::endl;

    //Let's find Bob number 2
    Bob* bob = std::find_if(bobs, bobs + size, isBobNumberTwo);
    if (bob->val == 2)
        std::cout << "Ok, found the right one!\n";
    else 
        std::cout << "Whoops!\n";

    return 0;
}
于 2008-10-06T21:09:46.080 回答