0

有什么方法可以在 C 中使用 std::pair 和 std::make_pair 吗?似乎它们适用于 C++。

正如我使用的

#include "utility"

它说它找不到这样的文件

谢谢你的任何建议

4

5 回答 5

6

它仅适用于 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);

但这真的不值得麻烦,结果代码比使用普通结构更冗长且不那么明显。

于 2011-09-28T13:32:59.253 回答
1

不,您不能在 C 中使用 STL(因为 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;
}
于 2011-09-28T13:33:33.390 回答
0

有什么方法可以在 C 中使用 std::pair 和 std::make_pair 吗?似乎它们适用于 C++。

No.std::pair是 C++ 中的模板类,C 中没有类。

也没有与 C 中的对相似的(即易于使用的预定义数据结构)。

于 2011-09-28T13:32:47.740 回答
0

不,这些是 C++ 标准库中的类型。这解释了 std:: 命名空间语法(C 也不支持命名空间)。

于 2011-09-28T13:32:55.600 回答
0

“实用程序”不是标准的 C 标头。

不,标准 C++ 库完全依赖于不属于 C 语言的模板。

于 2011-09-28T13:33:29.037 回答