要了解C ++ 11的复杂性,我正在尝试使用unique_ptr
。
我想知道,有没有办法使用iota
来初始化unique_ptr
的容器?
我开始使用独特的无需ptr的解决方案,该工作正常:
std::vector<int> nums(98); // 98 x 0
std::iota(begin(nums), end(alleZahlen), 3); // 3..100
现在让我们尽可能使用unique_ptr
std::vector<std::unique_ptr<int>> nums(98); // 98 x nullptr
std::unique_ptr three{ new int{3} };
std::iota(begin(nums), end(nums), std::move{three});
这显然失败了。原因:
three
标记为move
作为&&
,但这可能不足以将初始值复制/移动到容器中。++initValue
也无效,因为initValue
的类型为unique_ptr<int>
,并且未定义operator++
。但是:我们可以定义一个自由函数unique_ptr<int> operator++(const unique_ptr<int>&);
,至少可以解决这个问题。unique_ptr
再次禁止复制/移动该操作的结果,这次我无法看到如何欺骗编译器使用move
。嗯,那就是我停下来的地方。我想知道我是否遗漏了一些有趣的想法,告诉编译器他可能会move
operator++
的结果。或者还有其他障碍吗?
答案 0 :(得分:3)
要以unique_ptr
的98个实例结束,必须有98个new
的来电。你试图逃脱只有一个 - 不可能飞。
如果你真的想把一个方钉钉在圆孔上,你可以做something like this:
#include <algorithm>
#include <iostream>
#include <memory>
#include <vector>
class MakeIntPtr {
public:
explicit MakeIntPtr(int v) : value_(v) {}
operator std::unique_ptr<int>() {
return std::unique_ptr<int>(new int(value_));
}
MakeIntPtr& operator++() { ++value_; return *this; }
private:
int value_;
};
int main() {
std::vector<std::unique_ptr<int>> nums(98);
std::iota(begin(nums), end(nums), MakeIntPtr(3));
std::cout << *nums[0] << ' ' << *nums[1] << ' ' << *nums[2];
return 0;
}
答案 1 :(得分:2)
也许std::generate_n
是一个更好的算法吗?
std::vector<std::unique_ptr<int>> v;
{
v.reserve(98);
int n = 2;
std::generate_n(std::back_inserter(v), 98,
[&n]() { return std::make_unique<int>(++n); });
}