首页 > 解决方案 > 使用赋值运算符复制 std::vector

问题描述

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).

如何解决这个问题?

标签: c++stl

解决方案


实际上,OP 遗漏了重要的细节。

但是,我敢写答案,因为它实际上很清楚。

的复制分配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

Live demo on coliru

struct T有(默认)复制分配,但struct U我已明确删除它。

更改#if 1#if 0,代码不再编译。


在 OP 提供了缺失的信息后,我的答案更新了:

std::vector::assign()

  • 源向量的元素类型可以分配给目标向量的元素类型。

这对于在 OP 的特定情况下分配是正确MyStruct*void*

例子:

#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

Live demo on coliru


推荐阅读