gpt4 book ai didi

c++ - 我可以在 C++ 中通过 operator[] 正确设置 std::vector 的第 n 个值吗?

转载 作者:行者123 更新时间:2023-11-28 05:18:41 25 4
gpt4 key购买 nike

我正在学习 C++ 的 std::vector。我对 std::vector 的 operator[] 有两个问题。

假设我通过 operator[] 设置 std::vecotr 的第 n 个值,

(1) 第n个值之前的元素不初始化

(2) 我可以通过 operator[] 设置第 n 个值,但它不会正确更改其大小和迭代器。

以下是测试代码。

/* 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();
}

它的输出如下,

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

我可以通过 operator[n] 设置 std::vector 的第 n 个值吗?如果可以的话,如何初始化第 n 个值之前的值?

非常感谢。

最佳答案

是的,您可以使用 operator[] 设置第 N 个值。但是,该元素必须已经存在(pos < size());与某些稀疏数据结构(或 std::map)不同,对于 vector ,operator[] 不会添加元素。

元素通常使用 push_back、insert 或 resize(还有 assign、emplace、emplace_back...)添加。对于调整大小,有一个可选的第二个参数,用于指定添加元素的初始值。

根据您的示例,您可以:

std::vector<Tmp> b;
b.resize(7, Tmp(-1));
b[6] = Tmp(6);

元素 0-5 现在将包含 _id == -1 的 Tmp 实例。

还有一个类似的构造器,这段代码完成的是一样的:

std::vector<Tmp> b(7, Tmp(-1));

std::vector::reserve 不会改变容器的大小,它只会预先分配一个足够大的内部数组,以便在该容量内添加元素不需要重新分配 vector 。

关于c++ - 我可以在 C++ 中通过 operator[] 正确设置 std::vector 的第 n 个值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41993480/

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