Есть ли способ / трюк для передачи std :: set в C API, который ожидает C Array? - PullRequest
2 голосов
/ 03 октября 2011

Есть ли способ / трюк для передачи std :: set в C API, который ожидает C Array?

Ответы [ 3 ]

11 голосов
/ 03 октября 2011

Не напрямую, но вы можете сначала преобразовать набор в вектор (называемый, скажем, vec), а затем передать &vec[0], который является указателем на первый элемент внутреннеговекторный массив.

В C ++ 11 вы можете передать vec.data() вместо &vec[0].

3 голосов
/ 03 октября 2011

Нет, но вы можете довольно быстро заполнить массив заданным содержимым.Например, предположим, что mySet - это набор того же типа, что и YOUR_TYPENAME:

YOUR_TYPENAME arr* = new YOUR_TYPENAME[mySet.size()];
std::copy(mySet.begin(), mySet.end(), arr);

Затем просто передайте arr в C API.

1 голос
/ 04 октября 2011

Для полноты, вектор, альтернативный текущему принятому ответу, будет выглядеть следующим образом:

{
  std::vector<YOUR_TYPENAME> arr(mySet.begin(), mySet.end());
  Your_C_API(&arr[0]);
  // memory implicitly freed on next line
}

Я предпочитаю этот стиль, потому что:

  • Он занимает на одну строку меньше
  • Это устраняет класс ошибок, которые я часто совершаю (то есть, забывая о delete).
...