c++ - 使用赋值运算符复制 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).
如何解决这个问题?
解决方案
实际上,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
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
推荐阅读
- mysql - SELECT 后无法获取行数据
- java - java中的相对路径不正确
- sql - SQL Server - 为什么外键没有连接到主键
- python - 使用 Python 将内容从单个文件夹拆分到多个子文件夹
- java - 找不到驱动程序
- tfs - WIKI VSTS TFS 2018 - 带有代码的自定义页面
- sql - ST_AddPoint 函数是在 GeoDjango 中实现的吗?
- javascript - Jquery UI 对话框在 if 条件下打开
- json - 如何通过 Ajax 发送 Django 模型及其相关(_set)?
- java - 查找列表的对象是否存在于另一个列表中