Обертка некопирования STL вокруг существующего массива?

Обычно вы бы выставили SPI и API , которые авторы плагинов могут использовать для реализации своего кода. Обычно эти классы упакованы как отдельный JAR, это позволяет иметь минимальную зависимость для создания плагина.

Есть несколько хороших примеров архитектуры плагинов, которые вы можете изучить:

  • JDBC предоставляет java.sql.Connection и связывает классы, поэтому проекты баз данных могут реализовывать драйверы для Java.

  • SLF4J обрабатывает новые привязки каркаса логгера как плагины. Существует slf4-api и slf4j-ext зависимости , которые используются для реализации плагина.

9
задан Martin York 6 October 2008 в 21:05
поделиться

5 ответов

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

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

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

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

22
ответ дан 4 December 2019 в 06:27
поделиться

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

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);
}
5
ответ дан 4 December 2019 в 06:27
поделиться

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

Конечный итератор N.B.The должен быть одним элементом мимо конца массива. Следовательно data+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"));
}
5
ответ дан 4 December 2019 в 06:27
поделиться

Можно использовать Повышение. Массив для создания типа массива 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.

4
ответ дан 4 December 2019 в 06:27
поделиться

Указатель является действительной моделью итератора:

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;
}
2
ответ дан 4 December 2019 в 06:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: