如何使用size参数初始化std :: vector并使每个对象独立构造?

Sta*_*ked 11 c++

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

std::vector<std::string> names(10);
Run Code Online (Sandbox Code Playgroud)

然而,这几次导致了意想不到的结果.例如,在以下代码中,每个代码都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() << " ";
    }
}
Run Code Online (Sandbox Code Playgroud)

控制台输出:

0 0 0 0 0 0 0 0 0 0
Run Code Online (Sandbox Code Playgroud)

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

explicit vector(size_type __n,
                const value_type& __value = value_type(),
                const allocator_type& __a = allocator_type());
Run Code Online (Sandbox Code Playgroud)

显然,矢量是用同一个对象的副本初始化的.

是否还有一种方法可以构建每个对象的默认值?

Joh*_*ing 4

generate或者generate_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, " "));
}
Run Code Online (Sandbox Code Playgroud)

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