Can I set nth value of std::vector by operator[] properly in c++?
我在学习STD:C++的向量。我对std::vector的操作符[]有两个问题。
假设我通过操作符[]设置std::vecotr的第n个值,
(1)n个值之前的元素未初始化。
(2)我可以通过操作符[]设置第n个值,但它没有正确地更改其大小和迭代器。
以下是测试代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | /* Test class : its has only id_ and it can print it. */ class Tmp { public : Tmp(int new_id) : id_(new_id) { std::cout <<"class Tmp constructor. id =" << id_ << std::endl; } void print(void) { std::cout <<"id =" << id_ << std::endl; } private : int id_ = 777; }; std::vector<Tmp> b; b.reserve(1); /* push_back() automatically expands buffer of std::vector. */ b.push_back(Tmp(1)); b.push_back(Tmp(2)); b.push_back(Tmp(3)); b.push_back(Tmp(4)); b.push_back(Tmp(5)); std::cout <<"Before operator[] : size =" << b.size() <<", capacity =" << b.capacity() << std::endl; /* I set the 7 th value. */ b[6] = Tmp(7); b[6].print(); /* Operator[6] does not change size of std::vector. */ std::cout <<"Before operator[] : size =" << b.size() <<", capacity =" << b.capacity() << std::endl; /* Operator[6] did not expand iterator of std::vector correctly. */ for (auto it = b.begin(); it != b.end(); ++it) { it->print(); } |
其输出如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | class Tmp constructor. id = 1 class Tmp constructor. id = 2 class Tmp constructor. id = 3 class Tmp constructor. id = 4 class Tmp constructor. id = 5 Before operator[] : size = 5, capacity = 8 class Tmp constructor. id = 7 id = 7 After operator[] : size = 5, capacity = 8 id = 1 id = 2 id = 3 id = 4 id = 5 |
我可以用操作符[n]设置std::vector的第n个值吗?如果我能做到这一点,如何在第n个值之前初始化值?
非常感谢你。
是的,可以使用运算符[]设置第n个值。但是,元素必须已经存在(pos 元素通常添加为"后推"、"插入"或"调整大小"(也包括"分配"、"放置"、"放置回…")。使用resize,有一个可选的第二个参数指定添加元素的初始值。 举个例子,您可以:
1 2 3 | std::vector<Tmp> b; b.resize(7, Tmp(-1)); b[6] = Tmp(6); |
元素0-5现在包含的tmp实例的id为-1。
还有一个类似的构造函数,此代码实现相同的功能:
1 | std::vector<Tmp> b(7, Tmp(-1)); |
std::vector::reserve不会更改容器的大小,它只预先分配一个足够大的内部数组,这样在该容量内添加元素就不需要向量重新分配。