我喜欢创建具有给定大小和值的向量,例如:
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)
显然,矢量是用同一个对象的副本初始化的.
是否还有一种方法可以构建每个对象的默认值?
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
| 归档时间: |
|
| 查看次数: |
14558 次 |
| 最近记录: |