#c #utility #std-pair
#c #утилита #std-pair
Вопрос:
Есть ли какой-либо способ использовать std::pair и std::make_pair в C? кажется, что они применимы в C .
Поскольку я использовал
#include "utility"
он говорит, что не может найти такой файл
спасибо за любые предложения
Комментарии:
1. std::pair — это шаблонный класс в C . В C. нет ни шаблонов, ни классов.
Ответ №1:
Это только для 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. В нем говорится:./m2s.h:542:9: ошибка: неизвестное имя типа ‘type1’ ./m2s.h:543:9: ошибка: неизвестное имя типа ‘type2’ ./m2s.h:544:5: ошибка: ожидаемый идентификатор или ‘(’ перед ‘}’ токен
2. @mahmood вы уверены , что компилируете с помощью компилятора C, а не компилятора C ?
3. @manhood, отредактировано: я забыл обратную косую черту в многострочных макросах.
4. @WTP make использует «gcc» для сборки.
5. Любопытно, что этот ответ неверен. По крайней мере, часть «Да» 😉 К сожалению, я не могу отредактировать это, не изменив больше вещей (6 символов thd).
Ответ №2:
Нет, вы не можете использовать 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(amp;a, amp;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;
}
Комментарии:
1. Обратите внимание, что это может быть медленнее, чем
std::pair
из-за динамического выделения памяти.
Ответ №3:
Есть ли какой-либо способ использовать std::pair и std::make_pair в C? кажется, что они применимы в C .
Нет. std::pair
является шаблонным классом в C , а в C. классов нет.
Ничего подобного (т.е.. легко используемая предопределенная структура данных) для пар в C либо.
Ответ №4:
Нет, это типы из стандартной библиотеки C . Что объясняет синтаксис std:: namespace (C также не поддерживает пространства имен).
Ответ №5:
«утилита» не является стандартным заголовком C.
И нет, стандартная библиотека C полностью зависит от шаблонов, которые не являются частью языка C.
Комментарии:
1. «утилита» — это стандартный заголовок в C . Разница между
""
и<>
зависит от реализации.