2009-11-18 3 views
12

В основном я хотел бы сделать что-то подобное:Передача массивов фиксированного размера в C++?

int[3] array_func() 
{ 
    return {1,1,1}; 
} 

int main(int argc,char * argv[]) 
{ 
    int[3] point=array_func(); 
} 

Но это не кажется законным в C++. Я знаю, что могу использовать векторы, но поскольку я знаю, что размер массива является константой, похоже, что потеря производительности может произойти. Я также хотел бы избежать new, если могу, потому что распределение материала в стеке проще и, вероятно, также улучшит производительность.

Какое решение здесь?

ответ

13

Использование C++ 0x, почти завершена новый стандарт C++ (уже реализованный в последних версиях gcc и msvc IIRC), вы можете сделать это именно так, как хотите! Просто используйте std :: array вместо int [3].

std::array<int, 3> array_func() 
{ 
    return {1,1,1}; 
} 

int main(int argc,char * argv[]) 
{ 
    std::array<int, 3> point = array_func(); 
} 
18

Вы можете обернуть его в struct, чтобы сделать его возвратным по значению:

struct Vec3 
{ 
    float x[3]; 
} 

Vec3 array_func() 
{ 
    Vec3 x = { 1.f, 1.f, 1.f }; 

    return x; 
} 

Я не думаю, что вы можете использовать синтаксис массива инициализатора непосредственно в ответном сообщении. Конечно, можно ввести конструктор (структуры являются только классы со всеми членами общественных, в конце концов):

struct Vec3 
{ 
    Vec3(a, b, c) 
    { 
    x[0] = a; 
    x[1] = b; 
    x[2] = c; 
    } 

    float x[3]; 
} 

Vec3 array_func() 
{ 
    return Vec3(1.f, 1.f, 1.f); 
} 
+4

Это был бы лучший ответ, за исключением того, что такая структура уже существует: http://stackoverflow.com/questions/1755000/1755017#1755017 – sbi

+7

Я выбрал это как лучший ответ, потому что он отвечает на мой вопрос простым и простым, не проталкивая библиотеку, которую я не просил. Не то, чтобы ответ на лампочку был плохим, я просто нашел ответ разговора немного яснее. –

+3

«... нажав библиотеку, я не просил ...» Ну, мы говорим здесь _boost_, а не только какую-то библиотеку. Во всяком случае, есть очень хорошая вероятность, что ваша стандартная реализация lib поставляется с 'std :: tr1 :: array' (C++ 03 или TR1) или даже' std :: array' (C++ 1x), что является точно таким же , (Который показывает, что повышение - это не просто еще одна библиотека. Это тестовый стенд для следующего стандарта C++, основанного членами комитета std именно по этой причине, имеет самые высокие стандарты качества и требовательные обзоры, и это способствует большому количеству материала к следующей стандартной библиотеке.) – sbi

21

Вставьте массив в структуры. boost::array такой пакет:

boost::array<int, 3> array_func() { 
    boost::array<int, 3> a = {{ 1, 1, 1 }}; 
    return a; 
} 

int main() { 
    boost::array<int, 3> b = array_func(); 
} 

Быстрый и грязный:

template<typename E, size_t S> 
struct my_array { 
    E data[S]; 
}; 

Обратите внимание, как вы можете использовать совокупный синтаксис инициализации.

+0

Я не понимаю, почему это так много, с использованием стандартных функций языка (в данном случае простой структуры) намного чище и быстрее, чем побуждение. Хотя я рекомендую шаблонную структуру, используемую здесь, - это самое простое решение, которое наиболее многократно используется, и что бы я сделал. – KomodoDave

+0

@ KomodoDave знаете ли вы, что вы можете делать 'sed, boost, std,' в моем выше фрагменте и даже не нужна «простая структура»? Ура, мы приземлились в 2011 году! иногда ссылаясь на «раздутый рост» (я полагаю), может оказаться, что в конечном итоге приведет к меньшему раздуванию, чем изобретать колесо. –

+2

@ KomodoDave Я бы предложил downvoting неправильные ответы, и те, которые на самом деле не отвечают на вопрос. Этот ответ мне кажется вполне подходящим. – jweyrich

2

Вы не можете вернуть массив фиксированного размера в C++. вы можете вернуть указатель на int (который будет использоваться как массив), но для этого потребуется выделить массив в куче, используя new.

в любом случае, вы можете передать массив в качестве аргумента в вашей функции:

void array_func(int result[3]) 
{ 
    result[0] = 1; 
    result[1] = 1; 
    result[2] = 1; 
} 

int main(int argc,char * argv[]) 
{ 
    int point[3]; 
    array_func(point); 
} 

однако, это больше походит на C, чем C++ ...

+0

новый не обязательно обязательно. Также возможно сделать массив статическим внутри функции array_func (если это возможно, конечно) – Christian

+1

Ум, разве это не означает, что '3' в объявлении параметра игнорируется? – sbi

+0

Да, вы правы, наконец, я даже не уверен, что он компилируется. вам может потребоваться опустить размер массива в объявлении функции ... –

0

boost::array является оберткой для массива на основе стека.

Обратите внимание, что распределение стека будет только дешевле, чем использование «нового», когда вам не нужно копировать большие массивы.

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