Войти
ФлеймФорумПрограммирование

Оцените обёртку над std::vector::push_back

Страницы: 1 2 Следующая »
#0
22:21, 23 июля 2014

Всем привет.

Я иногда пишу тулзы на коленке.
И бывает так что есть у меня структурки типа таких:

struct vec2i{int x;int y;};
struct t_quad{vec2i pos;vec2i size;};
И бывает надо массив из этих штуковин сделать.
Я обычно использую std::vector в таком случае.
И обычно надо вставить в std::vector<t_quad> какой-то новый элемент.
А новые функции типа таких писать лень:
void add_quad_to_vector(std::vector<t_quad>&arr,const vec2i&pos,const vec2i&size){...}
t_quad make_quad(const vec2i&pos,const vec2i&size){...}
Добавлять конструкторы не по умолчанию тоже лень.
Поэтому иногда в таких случаях я пишу вот так:
int main()
{
  std::vector<t_quad> arr;
  int w=100; int h=100;
  ...
  {
    t_quad tmp={vec2i(0,0),vec2i(w,h)};
    arr.push_back(std::move(tmp));
  }
  ...
  return 0;
}
Но обычно у меня у всех структур есть конструкторы по умолчанию(даже в тулзах на коленке). Поэтому способ выше не работает.
Приходиться писать вот так:
int main()
{
  std::vector<t_quad> arr;
  int w=100; int h=100;
  ...
  {
    t_quad tmp;tmp.pos=vec2i(0,0);
    tmp.size=vec2i(w,h);
    arr.push_back(std::move(tmp));
  }
  ...
  return 0;
}
Но обычно вот так:
int main()
{
  std::vector<t_quad> arr;
  int w=100; int h=100;
  ...
  {
    arr.push_back(t_quad());
    auto&back=arr.back();
    back.pos=vec2i(0,0);
    back.size=vec2i(w,h);
  }
  ...
  return 0;
}
А в этом году меня это достало и я написал вот такой шаблон vec_add_back:
template<class TYPE>
static TYPE&vec_add_back(vector<TYPE>&arr) // <--- Вот тут объявлен vec_add_back
{
  arr.push_back(TYPE());
  return arr.back();
}
Теперь я пишу вот так:
int main()
{
  std::vector<t_quad> arr;
  int w=100; int h=100;
  ...
  {
    auto&back=vec_add_back(arr);
    back.pos=vec2i(0,0);
    back.size=vec2i(w,h);
  }
  ...
  return 0;
}
Помоему теперь код стал короче и менее избыточным.
Оцените vec_add_back - обёртку над std::vector::push_back

Спасибо.


#1
22:36, 23 июля 2014

Adler
твой код трудно читать, особенно вне среды разработки, где нет навигации между объявлением и реализацией и т.д.


з.ы.
я не консерватор, но новый стандарт, несмотря на его популярность, начинает вызывать во мне отвращение. много-много новых возможностей он несет для причинения горя и печали. а за конструкции вида:

auto &whatIsThisShit = AddSomethingStrange(arrayFullOfShit);
я бы убивал, если б за это в тюрьму не сажали :/

#2
22:43, 23 июля 2014

emplace_back

#3
23:11, 23 июля 2014

TarasB
+1
Только увидел название темы - подумал, что автор изобрел emplace_back

#4
23:14, 23 июля 2014

Adler
А чем не устраивает emplace_back?

О Я не первый! Говорят у дураков мысли сходятся. ;-)

#5
23:18, 23 июля 2014

cranky
ок.

TarasB
> emplace_back
> Добавлять конструкторы не по умолчанию тоже лень.
Или я чего-то не знаю и для emplace_back они не нужны?

#6
23:37, 23 июля 2014

Жалко, что в C++ не завезли сишные инициализаторы структур:

typedef struct {
  int x, y;
} Point;

Point pt = { .x = 123, .y = 321 };

#7
23:39, 23 июля 2014

хм... я почему-то был уверен что emplace_back это такой push_back только с move-семантикой.
тоесть что-то типа:

void std::vector<TYPE>::emplace_back(TYPE&&ref,...);
а вон оно чё:
http://ideone.com/GIeOOS
оказываетсья emplace_back можно без параметров вызывать. офигеть.

ладно, тогда переделаю шаблон вот так:

template<class TYPE>
static TYPE&vec_add_back(vector<TYPE>&arr)
{
  arr.emplace_back();
  return arr.back();
}
Оцените.

}:+()___ [Smile]
первый раз про такое слышу, но оно работает!
http://ideone.com/TbzkuN
о_О

#8
23:53, 23 июля 2014
auto iterator = arr.emplace(arr.end());
#9
0:03, 24 июля 2014

eMan.Lived
> auto iterator = emplace(arr.end());
сильно недолюбливаю итераторы.
> error C3861: emplace: идентификатор не найден
http://ideone.com/aGfaPR
:(

#10
0:08, 24 июля 2014

Поправил.

#11
0:09, 24 июля 2014

}:+()___ [Smile]
> typedef struct {
> int x, y;
> } Point;
>
> Point pt = { .x = 123, .y = 321 };

struct Point{
  int x, y;
};


int main()
{
   
    Point pt = { 123, 321 };
}
#12
0:11, 24 июля 2014

Adler
> t_quad tmp={vec2i(0,0),vec2i(w,h)};
> arr.push_back(std::move(tmp));
А как насчёт arr.push_back({{0,0}, {w,h}})?
Правда нужен современный компилятор. Например, в студии это появилось только в версии 2013.

#13
0:31, 24 июля 2014

eMan.Lived
> Поправил.

auto&back=*arr.emplace(arr.end());
Неплохой вариант. Спасибо.

gammaker
> А как насчёт arr.push_back({{0,0}, {w,h}})?
компилятор от 2010 студии так не умеет, ну и ещё

у меня у всех структур есть конструкторы по умолчанию(даже в тулзах на коленке).

а с конструктором такое не работает:
http://ideone.com/vCT0u4
#14
1:27, 24 июля 2014

Adler
> компилятор от 2010 студии так не умеет
А перейти на новый никак нельзя?

Adler
> а с конструктором такое не работает:
Если есть конструктор по умолчанию, то надо сделать ещё и конструктор, принимающий 2 вектора. Тогда сработает.

Страницы: 1 2 Следующая »
ФлеймФорумПрограммирование

Тема в архиве.