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 に答える