Не копирующая оболочка STL вокруг существующего массива?

Можно ли создать контейнер в стиле STL или даже просто итератор в стиле STL для существующего массива элементов типа POD?

Например, предположим, что у меня есть массив целых чисел. Было бы удобно иметь возможность вызывать некоторые функции STL, такие как find_if, count_if или sort, непосредственно в этом массиве.

Не решение: копирование всего массива или даже просто ссылок на элементы. Цель состоит в том, чтобы максимально сэкономить память и время, при этом, надеюсь, разрешить использование других алгоритмов STL.

«Например, предположим, что у меня есть массив целых чисел. Было бы удобно иметь возможность вызывать некоторые функции STL, такие как find_if, count_if или sort непосредственно в этом массиве». Ты можешь. Все вышеперечисленное.

moswald 07.10.2008 01:12
Асинхронная передача данных с помощью sendBeacon в JavaScript
Асинхронная передача данных с помощью sendBeacon в JavaScript
В современных веб-приложениях отправка данных из JavaScript на стороне клиента на сервер является распространенной задачей. Одним из популярных...
Как подобрать выигрышные акции с помощью анализа и визуализации на Python
Как подобрать выигрышные акции с помощью анализа и визуализации на Python
Отказ от ответственности: Эта статья предназначена только для демонстрации и не должна использоваться в качестве инвестиционного совета.
Принципы ООП в JavaScript
Принципы ООП в JavaScript
Парадигма объектно-ориентированного программирования имеет 4 основных принципа,
Пройдите собеседование по Angular: Общие вопросы и ответы экспертов
Пройдите собеседование по Angular: Общие вопросы и ответы экспертов
Можете ли вы объяснить разницу между ngOnInit и конструктором в Angular?
Laravel с Turbo JS
Laravel с Turbo JS
Turbo - это библиотека JavaScript для упрощения создания быстрых и высокоинтерактивных веб-приложений. Она работает с помощью техники под названием...
Типы ввода HTML: Лучшие практики и советы
Типы ввода HTML: Лучшие практики и советы
HTML, или HyperText Markup Language , является стандартным языком разметки, используемым для создания веб-страниц. Типы ввода HTML - это различные...
9
1
2 010
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Вы можете использовать Boost.Array для создания типа массива C++ с семантикой STL.

С использованием массивов:

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.

Я не хотел копировать его в boost.array, но хотел использовать boost.array в качестве исходного объекта.

Ferruccio 07.10.2008 01:04
Ответ принят как подходящий

Вы можете вызывать многие алгоритмы STL непосредственно в обычном массиве стиля C - они были разработаны для этого. например.,:

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

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

Я думаю, вы обнаружите, что большинство вещей работает именно так, как вы и ожидали.

Все алгоритмы STL используют итераторы. Указатель - это действительный итератор в массиве объектов.

N.B. Конечный итератор должен находиться на один элемент после конца массива. Следовательно, данные + 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"));
}

Указатель - это допустимая модель итератора:

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;
}

Вы можете использовать встроенный шаблон функции, чтобы не дублировать индекс массива

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);
}

Другие вопросы по теме