Есть ли способ инициализировать контейнер одной строкой? [Дубликат]

0

Я ищу решение для ванили С++ 98 (без повышения, или qt и т.д.)

Есть ли способ сделать что-то вроде этого:

// valid in c++ 11
std::vector<Foo> vFoo {Foo1, Foo2, Foo3, Foo4} ;

или что-то вроде этого

// Well it is C# but you got the point.
List<Foo> lFoo = new List<Foo>() { Foo1, Foo2, Foo3, Foo4 };

Пока я использую это:

std::vector<Foo> vFoo;
vFoo.push_back(Foo1);
vFoo.push_back(Foo2);
vFoo.push_back(Foo3);
vFoo.push_back(Foo4);

Но я нахожу это уродливым. Любая идея улучшить его? Есть ли особый способ добиться этого?

Спасибо.

  • 0
    однострочники не всегда лучше, часто они хуже с точки зрения читабельности
  • 0
    @DocBrown Спасибо за ссылку! Много хороших решений внутри. Я закрою это.
Показать ещё 2 комментария
Теги:
collections

3 ответа

0
Лучший ответ

Я создаю собственное решение с помощью va_arg.

#include <cstdarg>
#include <iostream>
#include <vector>

template <typename T>
std::vector<T> initVector (int len, ...)
{
  std::vector<T> v;
  va_list vl;
  va_start(vl, len);
  v.push_back(va_arg(vl, T));
  for (int i = 1; i < len; ++i)
    v.push_back(va_arg(vl, T));
  va_end(vl);
  return v;
}

int main ()
{
  std::vector<int> v = initVector<int> (7,702,422,631,834,892,104,772);
  for(std::vector<int>::const_iterator it = v.begin() ; it != v.end(); ++it)
    std::cout << *it << std::endl;
  return 0;
}

Если вы хотите получить больше ответов, перейдите по ссылке Doc Brown.

  • 1
    Помните, что это работает только для типов POD (базовые типы данных, плюс классы без пользовательских конструкторов, виртуальные члены, ссылки и т. Д.). Стандарт C ++ 03: 5.2.2 / 7.
  • 0
    Спасибо за комментарий. Сегодня я узнаю что-то новое .
Показать ещё 1 комментарий
1

Короткий ответ: Нет. Поэтому, почему языковая поддержка таких конструкций была добавлена в С++ 11. Ваше существующее решение push_back является адекватным, если вы не можете использовать С++ 11.

  • 0
    Я наконец-то использовал свой ответ. Кстати, я люблю этот один .
  • 0
    @aloisdg: Я не знаю, я бы назвал размещение переменных функций в C ++ прямой медвежьей услугой для себя, будущих читателей и человечества. Просто сказать нет. (И да, инициализация из существующей коллекции всегда была легкой. Но это делает что-то другое.)
0

Вы можете инициализировать вектор из массива:

Foo[] initFoo = { Foo1, Foo2, Foo3, Foo4 };
std::vector<Foo> vFoo(initFoo, initFoo + 4);
  • 0
    Та же идея здесь . Мне тоже это нравится.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню