LINUX.ORG.RU

передать вектор в C++11

 ,


0

2

Предлагаю обсудить плюсы и минусы такой передачи вектора в C++11 (https://ideone.com/8bS0ur)

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
 
class A {
      std::vector<int> y;
public:
      A(){
          y.resize(5,10);
      }
      std::vector<int> f(){
          return std::move(y);
      }
};
 
int main(){
     A a;
     std::vector<int> x(5);
     x = a.f();
     std::copy( x.begin(), x.end(), std::ostream_iterator<int>(std::cout," ")) ;
}

$ c++ -std=c++11 vect.cpp && ./a.out
10 10 10 10 10

Что сказать-то хотел? Предлагаю обсудить релевантые 21 веку языки, где вместо арсенала для стрельбы в ногу 'should be one— and preferably only one —obvious way to do it'.

t184256 ★★★★★ ()
std::vector<int> x(5);

(5) здесь не нужно

      std::vector<int> f(){
          return std::move(y);
      }

Ты же понимаешь, да, что второй вызов этой функции к такому же результату не приведёт?

intelfx ★★★★★ ()

std::copy( x.begin(), x.end(), std::ostream_iterator<int>(std::cout," ")) ;

Давайте устроим конкурс на самую неочевидную строчку кода!

Dudraug ★★★★★ ()
Ответ на: комментарий от anonymous

К тому что в текущем конкретом примере такая конструкция избыточна. Да и не очевидна она. Да, я знаю, что подобны пример есть в оф доке

http://en.cppreference.com/w/cpp/iterator/ostream_iterator

Но более очевидным такой код не становится, от того что ты уже знаешь как оно работает. Можно и на ассемблере писать и понимать, что написано, но код от на ассемблере от этого не станет более читабельным. Но это придирка скорее в целом к проектированию stl, чем к автору.

Dudraug ★★★★★ ()
Ответ на: комментарий от intelfx

Ты же понимаешь, да, что второй вызов этой функции к такому же результату не приведёт?

почему? как правильно (и эффективно в С++11) выполнить передачу значений из внутреннего вектора объекта (класса) внешнему для объекта (класса) вектору?

P.S. да вот же понимаю, что понимаю не конца.

sci_reseacher ()

Число комментариев: 1
sci_reseacher

Предлагаю обсудить плюсы и минусы такой передачи вектора

Nice try!

По теме: Если из вектора в вектор. Референс же вернуть.

matrixd ()
Ответ на: комментарий от sci_reseacher

как правильно (и эффективно в С++11) выполнить передачу значений из внутреннего вектора объекта (класса) внешнему для объекта (класса) вектору?

Ты с задачей для начала определись. А то может тебе банальной константной ссылки хватит.

anonymous ()
Ответ на: комментарий от invy

И непонятно, что хотел сказать автор этим говнокодом.

tailgunner ★★★★★ ()
Ответ на: комментарий от sci_reseacher

выполнить передачу значений из внутреннего вектора объекта (класса) внешнему для объекта (класса) вектору?

Без std::move

Или возвращать const reference

Dudraug ★★★★★ ()
Последнее исправление: Dudraug (всего исправлений: 1)
Ответ на: комментарий от Dudraug

мне нужно в x получить значения из y, ну и хотелось бы сделать это наиболее эффективно

так будет правильно?

class A {
      std::vector<int> y;
public:
      A(){
          y.resize(5,10);
      }
      const std::vector<int> &&f(){
          return std::move( y );
      }
};

int main(){
     A a;
     std::vector<int> x(5);
     x = a.f();
     x = a.f();
     std::for_each( x.begin(), x.end(), [](int & e) {std::cout << e << " ";}) ;
}

sci_reseacher ()
Ответ на: комментарий от sci_reseacher

И что ты перемещаешь? У тебя вектор не удаляется из объекта А. Ты можешь либо вернуть ссылку на вектор, либо скопировать его.

invy ★★★★★ ()
Последнее исправление: invy (всего исправлений: 1)
Ответ на: комментарий от invy

Мне нужна копия значений из y в x.

Насколько я понял, что с семантикой перемещения элементов из одного вектора в другой не вызывается конструктор копирования элементов (не делается выделения памяти для промежуточной копии элемента, а затем уничтожения).

sci_reseacher ()
Ответ на: комментарий от sci_reseacher

Насколько я понял, что с семантикой перемещения элементов из одного вектора в другой не вызывается конструктор копирования элементов

Если возвращаешь ссылку то тоже ничего не вызывается.

Dudraug ★★★★★ ()
Ответ на: комментарий от sci_reseacher

Мне нужна копия значений из y в x.

Так копия?

не вызывается конструктор копирования элементов

Или не копия?

Ты определись.

invy ★★★★★ ()
Последнее исправление: invy (всего исправлений: 1)
Ответ на: комментарий от sci_reseacher

не делается выделения памяти для промежуточной копии элемента, а затем уничтожения

У тебя каша в голове.

Dudraug ★★★★★ ()
Ответ на: комментарий от sci_reseacher

Зачем? То, о чем ты говоришь, делается одним оператором присваивания. Если тебе нужно что-то другое - скажи, что.

tailgunner ★★★★★ ()
Ответ на: комментарий от invy

пытаюсь осмыслить С++11, мне нужна копия значений одного вектора в другой путем перемещения, без использования промежуточных копий элементов (с семантикой перемещения баз семантики копирования).

sci_reseacher ()
Ответ на: комментарий от sci_reseacher

мне нужна копия значений одного вектора в другой путем перемещения

Фейспалм. Так тебе надо скопировать или переместить? Если переместить - зачем тебе класс?

tailgunner ★★★★★ ()
Ответ на: комментарий от sci_reseacher

мне нужна копия значений одного вектора в другой путем перемещения

facepalm. Короче иди дальше в лурке сиди, товарищ сосницкий.

anonymous ()
Ответ на: комментарий от sci_reseacher

мне нужна копия значений одного вектора в другой путем перемещения

У тебя есть ящик пива из 20-и бутылок. Ты хочешь «получить копию бутылок из ящика пива путем перемещения».

Как ты себе это представляешь, объясни. Что после этой операции должно остаться в исходном ящике?

invy ★★★★★ ()
Последнее исправление: invy (всего исправлений: 1)
Ответ на: комментарий от sci_reseacher

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

Взаимоисключающие утверждения :-D

И да, ты мне должен новый парсер, этот сломался.

Twissel ★★★★★ ()
Ответ на: комментарий от Dudraug

Спасибо! похоже я неправильно понял семантику перемещения.

P.S. Мне нужна просто копия значений, причем даже ссылка подойдет, т.к. значения нужно только читать.

sci_reseacher ()
Ответ на: комментарий от sci_reseacher

так просто

      std::vector<int> f(){
          return y;
      }

      const std::vector<int>& f(){
          return y;
      }

Первый вариант - создание копии вектора, но копия независима от того что в объекте хранится. Второй - ссылка, никакого создание доп. объектов, но если изменится вектор в классе, то вектор по этой ссылке изменится (так как она ссылается на тот же класс). С++11 тут вообще не причем, это старый добрый с++ оригинальный.

Dudraug ★★★★★ ()
Последнее исправление: Dudraug (всего исправлений: 1)
Ответ на: комментарий от anonymous

там, где const ref возвращается, там вполне себе noexcept

DELIRIUM ☆☆☆☆☆ ()
Ответ на: комментарий от sci_reseacher

У тебя пустой вектор в `a` после вызова `f` будет.

Читай про move семантику (move конструкторы и move операторы =).

Kuzy ★★★ ()
Ответ на: комментарий от sci_reseacher

Так тоже самое. Только теперь у тебя компилятор проверяет, действительно ли ты вернул значением move-ом.

Kuzy ★★★ ()
Ответ на: комментарий от sci_reseacher

Ау, перемещение это когда ты не копируешь данные _данные_, а копируешь только указатель. При этом зануляя его в исходном векторе.

Тебе обычный operator = нужен, если ты хочешь скопировать.

Kuzy ★★★ ()

Этот тред нужно давать тем кто советует начинать учиться с C++.

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.