скопировать std :: vector с помощью оператора присваивания - PullRequest
0 голосов
/ 21 сентября 2018
std::vector<MyStruct*> v1;
std::vector<void*> v2;

У меня есть вектор stl указателя структуры.

Я хочу скопировать std::vector<MyStruct*> в std::vector<void*>.

Если я использую v2 = v1, я получаю нижеошибка:

error C2679: binary '=' : no operator found which takes a right-hand operand of
             type 'std::vector<_Ty>' (or there is no acceptable conversion).

Как восстановить это?

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

На самом деле ОП опускает важные детали.

Тем не менее, я осмелюсь написать ответ, так как он на самом деле вполне понятен.

Копировать назначение std::vectorвозможно, когда

  • вектор источника и назначения имеет одинаковый тип элемента
  • тип элемента обеспечивает назначение копирования.

Пример:

#include <iostream>
#include <vector>

struct T {
  int value;
};

struct U {
  int value;
  U& operator=(const U&) = delete;
};

int main ()
{
#if 1 // OK:
  { std::vector<T> v1(10), v2;
    v2 = v1;
    std::cout << "After v2 = v1; v2 has size " << v2.size() << '\n';
  }
#else // Wrong: (U has no assignment!)
  { std::vector<U> v1(10), v2;
    v2 = v1;
    std::cout << "After v2 = v1; v2 has size " << v2.size() << '\n';
  }
#endif // 1
  return 0;
}

Вывод:

After v2 = v1; v2 has size 10

Живая демонстрация на coliru

struct T имеет (по умолчанию) назначение копированияно в struct U я явно удалил его.

Изменив #if 1 на #if 0, код больше не компилируется.


После того, как OP предоставил недостающую информацию,обновление моего ответа:

std::vector::assign() является альтернативой, когда

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

Это верно для присвоения MyStruct* для void* в конкретном случае OP.

Пример:

#include <iostream>
#include <vector>

struct T {
  int value;
};

struct U {
  int value;
  U& operator=(const T &t) { value = t.value; return *this; }
};

int main ()
{
  { std::vector<T> v1(10);
    std::vector<U> v2;
    v2.assign(std::begin(v1), std::end(v1));
    std::cout << "After v2.assign(std::begin(v1), std::end(v1)) v2 has size " << v2.size() << '\n';
  }
#if 1 // OK:
  { T t[] = { { 1 }, { 2 }, { 3 } };
    std::vector<T*> v1{ t + 0, t + 1, t + 2 };
    std::vector<void*> v2;
    v2.assign(std::begin(v1), std::end(v1));
    std::cout << "After v2.assign(std::begin(v1), std::end(v1)) v2 has size " << v2.size() << '\n';
  }
#else // Wrong: (Assignment from void* to T* not permitted!)
  { std::vector<void*> v1(10, nullptr);
    std::vector<T*> v2;
    v2.assign(std::begin(v1), std::end(v1));
    std::cout << "After v2.assign(std::begin(v1), std::end(v1)) v2 has size " << v2.size() << '\n';
  }
#endif // 1
  return 0;
}

Выход:

After v2.assign(std::begin(v1), std::end(v1)) v2 has size 10
After v2.assign(std::begin(v1), std::end(v1)) v2 has size 3

Живая демоверсия на колиру

0 голосов
/ 21 сентября 2018

Вы почти наверняка пытаетесь скопировать векторы, содержащие элементы разных типов.Даже если типы элементов в векторах конвертируются компилятором (например, double и int), их коллекции не являются.Вы можете управлять им, используя функцию std::copy, однако:

#include <algorithm>
#include <iterator>
// ...
std::vector v1<int>;
// ...
std::vector v2<double>;
std::copy(v1.begin(), v1.end(), std::back_inserter(v2));

Вы упомянули, что в вашем случае один из ваших векторов содержит указатели.Если типы указателей конвертируются компилятором, скажем, копируя указатели производного класса в указатели базового класса, std::copy будет работать так же, как указано выше.

Если указатели не конвертируемы, то вы должны использовать std::transform вместо std::copy и поставьте соответствующий состав.Например, копирование базового класса в указатели производного класса:

class Y : public class X { ... };
std::vector v3<X*>;
// ...
std::vector v4<Y*>;
std::transform(v3.begin(), v3.end(), std::back_inserter(v4),
               [](X* arg) { return dynamic_cast<Y*>(arg); });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...