используя пару и make_pair в стандартном C - PullRequest
0 голосов
/ 28 сентября 2011

Есть ли способ использовать std :: pair и std :: make_pair в C? кажется, что они применимы в C ++.

Как я использовал

#include "utility"

говорит, что не может найти такой файл

спасибо за любое предложение

Ответы [ 5 ]

6 голосов
/ 28 сентября 2011

Это только C ++. В C нет шаблонов, поэтому вам придется свернуть свои собственные макросы, чтобы эмулировать их до некоторой степени, например:

#define PAIR_TYPE(type1, type2)\
    typedef struct {\
        type1 first;\
        type2 second;\
    }
#define MAKE_PAIR(val1, val2) {val1, val2}

PAIR_TYPE(int, float) mypair;
mypair p = MAKE_PAIR(1, 12.0);

Но это действительно не стоит того, чтобы код результата был более подробным и менее очевидным, чем просто использование простых структур.

1 голос
/ 28 сентября 2011

Нет, вы не можете использовать STL в C (так как STL работает только с C ++ и Objective-C ++). Вы можете имитировать std::pair с помощью структуры и указателей (поскольку C не поддерживает шаблоны):

struct pair {
  void *first;
  void *second;
};

void FreePair(struct pair* pair) {
  free(pair->first);
  free(pair->second);
  free(pair);
}

struct pair* MakePair(void *f, void *s, size_t fsize, size_t ssize) {
  struct pair* p = malloc(sizeof(struct pair));
  if (p == NULL) return NULL;
  p->first = malloc(fsize);
  p->second = malloc(ssize);
  if (p->first == NULL || p->second == NULL) {
    FreePair(p);
    return NULL;
  }
  memcpy(p->first, f, fsize);
  memcpy(p->second, s, ssize);
  return p;
}

int main() {
  int a = 42;
  const char* str = "Hello";
  struct pair* p = MakePair(&a, &str, sizeof(a), sizeof(str));
  printf("%d, %s", *(int*)p->first, *(const char**)p->second); // output: "42, Hello"
  FreePair(p);                              //  ^^ yes, this pointer pointer is correct
  return 0;
}
0 голосов
/ 28 сентября 2011

«Утилита» не является стандартным заголовком C.

И нет, стандартная библиотека C ++ полностью зависит от шаблонов, которые не являются частью языка C.

0 голосов
/ 28 сентября 2011

Нет, это типы из стандартной библиотеки C ++.Это объясняет синтаксис пространства имен std :: name (C также не поддерживает пространства имен).

0 голосов
/ 28 сентября 2011

Есть ли способ использовать std :: pair и std :: make_pair в C?кажется, что они применимы в C ++.

Нет.std::pair - это шаблонный класс в C ++, и в C. нет классов.

Нет ничего похожего (т.е. легко используемой предопределенной структуры данных) на пары в C.

...