gpt4 book ai didi

c++ - 如何使用大小参数初始化 std::vector 并独立构造每个对象?

转载 作者:可可西里 更新时间:2023-11-01 15:08:06 29 4
gpt4 key购买 nike

我喜欢创建具有给定大小和值的 vector ,例如:

std::vector<std::string> names(10);

然而,这几次却导致了意想不到的结果。例如,在下面的代码中,每个 UniqueNumber 都具有相同的值:

#include <iostream>
#include <string>
#include <vector>


struct UniqueNumber
{
UniqueNumber() : mValue(sInstanceCount++)
{
}

inline unsigned int value() const
{
return mValue;
}

private:
static unsigned int sInstanceCount;
unsigned int mValue;
};


int UniqueNumber::sInstanceCount(0);


int main()
{
std::vector<UniqueNumber> numbers(10);
for (size_t i = 0; i < numbers.size(); ++i)
{
std::cout << numbers[i].value() << " ";
}
}

控制台输出:

0 0 0 0 0 0 0 0 0 0

在查看 std::vector 的构造函数时确实有意义:

explicit vector(size_type __n,
const value_type& __value = value_type(),
const allocator_type& __a = allocator_type());

显然 vector 是用同一对象的拷贝初始化的。

是否还有一种方法可以让每个对象默认构造?

最佳答案

generategenerate_n 是专为您想要做的事情而设计的。这是一个完整的示例:

#include <algorithm>
#include <vector>
#include <iterator>
#include <iostream>
using namespace std;

class Foo
{
public:
Foo() : n_(++water_) {};
operator unsigned () const { return n_; }
private:
static unsigned water_;
unsigned n_;
};

Foo make_foo()
{
return Foo();
}

unsigned Foo::water_ = 0;

int main()
{
vector<Foo> v_foo;
generate_n(back_inserter(v_foo), 10, &make_foo);
copy(v_foo.begin(), v_foo.end(), ostream_iterator<unsigned>(cout, " "));
}

输出:1 2 3 4 5 6 7 8 9 10

关于c++ - 如何使用大小参数初始化 std::vector 并独立构造每个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4762668/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com