我可以在c ++中正确设置运算符[]的std :: vector的第n个值吗?

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不会更改容器的大小,它只预先分配一个足够大的内部数组,这样在该容量内添加元素就不需要向量重新分配。