2015-08-19 5 views
0

Можно ли иметь #define заявления, которое выполняет следующее:Как создать #define для создания 2d-вектора?

для простого вектора я могу это сделать:

#define dvec std::vector<double> 
dvec x1d(n) 

к сведению, что инстанцирование это точно так же, как и для нормального вектора. Но для 2d векторов, это не так приятно:

#define dvec2d std:vector<std:vector<double>> 
dvec2d x2d(n, std:vector<double>(m)) 

Как я создаю определить так, что все, что мне нужно сделать, чтобы создать экземпляр dvec2d быть таким:

dvec2d x2d(n, m) 

Конечно, я могу это сделать:

dvec2d x2d(n, std:vector<double>(m)) 

каждый раз, когда я хочу, чтобы создать один из них, но я предпочел бы не иметь, что там дополнительные std:vector<double> - это было бы аккуратнее, если я мог бы просто dvec2d x2d(n, m).

EDIT: Чтобы уточнить, я знаю, что могу создать функцию, чтобы дать мне вектор или typedef, это не то, что мне нужно. Люди, использующие функции, собираются вставлять в них vector<vector<double>>, так что это то, что им нужно. Но я не хочу иметь определения функций, которые являются массивными из-за всех определений там. Использование этого #define dvec2d ....

Теперь, когда я тестирую свои вещи, мне нужно создать 2d векторы. Я знаю, что могу сделать это с dvec2d my2dVector(n, std::vector<double>(m)), но то, что я хочу знать, есть, если есть какой-либо способ, я могу написать #define, чтобы я мог создать этих парней вот так: dvec2d my2dVector(n,m)?

+1

Вместо этого используйте 'typedef'. Макросы плохие и склонны генерировать неясные ошибки. Также вам понадобится параметризованный макрос, не так ли? –

+0

Я использую макросы, так что функции, которые я пишу, все равно могут использовать 'vector >' снаружи, но мне просто хотелось бы, чтобы он был чище внутри кода. Я не собираюсь создавать многие из них, но я просто хотел знать, как это сделать ... – will

+0

Если 'n' и' m' являются переменными, используйте встроенную функцию. Гораздо чище, чем макрос. –

ответ

3

Вместо использования макроса вы можете использовать функцию шаблона. Вы можете сделать make_2d_vector функции, как:

template<typename T> 
std::vector<std::vector<T>> make_2d_vector(std::size_t rows, std::size_t cols) 
{ 
    return std::vector<std::vector<T>>(rows, std::vector<T>(cols)); 
} 

Затем, когда вы хотите создать 2d вектор можно использовать:

auto foo = make_2d_vector<double>(5,10); 

Live Example

Как отметил Nipheris, если вы не иметь доступа к auto Вы всегда можете создать typedef:

typedef std::vector<std::vector<double>> vector2d; 
vector2d foo = make_2d_vector<double>(5,10); 
+3

@hyde typedef может помочь в случае старого компилятора. Почему бы не использовать «vector2d»? – Nipheris

+0

@Nipheris mind Если я сброшу это на свой ответ? – NathanOliver

+0

@hyde _ ", синтаксис становится довольно уродливым" _ Что на самом деле уродливо с 'std :: vector > foo' ?? Тем более, что ОП заявили, что они явно хотят использовать этот синтаксис? –

Смежные вопросы