使用赋值运算符复制 std::vector
copy std::vector using assignment operator
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
在科里鲁上进行现场演示
几乎可以肯定,您正在尝试复制包含不同类型元素的向量。 即使向量中的元素类型可由编译器转换(例如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); });
相关文章:
- 尝试使用 std::vector<std::thread时出现静态断言失败错误>
- 字符串化递归的"std::vector<std::vector<...>>"而不使用部分模板函数专用化
- 连接和压缩标准::vector<std::字符串的最佳方法>
- C++从 std::vector<std::function<中删除 std::function>>
- 如何在构造函数初始值设定项列表中使用 n 个元素初始化 std::vector<std::time_t>
- 如何使用 CUDA 将 std::vector<std::string> 复制到 GPU 设备
- 编译错误 std::vector<std::shared_ptr<T>>迭代器和擦除方法
- 将 std::vector<std::unique_ptr<T>> 移动到 std::vector<std::shared_ptr<T>>
- 如何从 boost::container::vector<std::string>::iterator 访问索引和对象?
- 使用 std::vector<std::future<int>> 和 std::async 启动几个线程时中止
- 为什么转置这个 std::vector<std::vector<std::string> > 这么慢?
- 是否有可能在没有复制的情况下传递 std::vector<int> 作为参数来获得 std::vector<std::array<int, 3>>?
- 在 boost::<double>asio::buffer 中使用像 std::vector<std::complex> 这样的参数
- 如何从 std::initializer_list<char const* 构建 std::vector<std::string>>
- 如何检查 std::vector<std::string> 的元素是否以某个子字符串开头?
- 在 std::vector<std::vector 中重新存储内部向量<TYPE>>
- 将 std::vector<std::string> 转换为 const char* const*
- 不能将结构push_back() 转换为 std::vector<std::shared_ptr<theStruct>> theVector
- SWIG:传递一个 std::vector< std::vector <double> >指向 python 的指针
- 将 std::vector<std::p air<const K, V>*> 转换为 std::vector<std::p air<const K, V>&g