2015-08-03 7 views
3

Я пытаюсь написать функцию полезности, которая вернет вектор. Возвращаемый вектор всегда будет иметь одни и те же записи. Я использую его для фильтрации перечисления (Directions), чтобы клиенты могли получить желаемое подмножество.Функция, которая всегда возвращает тот же вектор

Вот пример того, как я надеюсь подойти к решению проблемы:

std::vector<Directions> horizontalDirections() 
{ 
    static std::vector<Directions> toReturn; 
    if (toReturn.size() == 0) 
    { 
     toReturn.push_back(Left); 
     toReturn.push_back(Right); 
    } 
    return toReturn; 
} 

Является ли это правильный способ пойти об этом?

+0

В некоторых случаях вектор может быть очень большим. Вот почему я хочу избежать того, чтобы все толкать в вектор, если мне это не нужно. – user2445507

+0

Вы можете вернуть 'const vector' по ссылке –

ответ

8

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

const std::vector<Directions>& horizontalDirections(); 

Кроме того, если вы используете C++ 11, ваша реализация может быть сокращенно:

const std::vector<Directions>& horizontalDirections() 
{ 
    static std::vector<Directions> toReturn({Left, Right}); 
    return toReturn; 
} 

При использовании C++ 11, вы могли бы пойти еще дальше и объявить вам horizontalDirections как глобальный const vector вместо функции:

const std::vector<Directions> horizontalDirections({Left, Right}); 
+1

Обратите внимание, что глобальная версия объекта может вносить вклад в статический порядок инициализации Fiasco. (Функциональная версия может быть задействована только в файле Destruction Order Fiasco.) – aschepler

5

Это в основном верно идея. Я бы вернулся со ссылкой, чтобы избежать копирования вектора. И вы можете сделать тело гораздо более разборчивыми при помощи C++ 11 инициализатора-лист стиль: с

const std::vector<Directions>& horizontalDirections() { 
    static const std::vector<Directions> toReturn = { 
     Left, 
     Right 
    }; 
    return toReturn; 
} 
+1

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

0

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

const std::vector<Direction> horizentalDirections = {Left, Right}; 

вот что константы созданы для.

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