我可以在 c++ 中正确设置 std::vector by operator[] 的第 n 个值吗?
Can I set nth value of std::vector by operator[] properly in c++?
我正在学习 std::vector of c++。我对 std::vector 的运算符 [] 有两个问题。
假设我通过运算符 [] 设置 std::vecotr 的第 n 个值,
(1) 第 n 个值之前的元素未初始化。
(2) 我可以通过运算符 [] 设置第 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
我可以通过运算符 [n] 设置 std::vector 的第 n 个值吗?如果我能做到,如何在第 n 个值之前初始化值?
谢谢。
是的,您可以使用运算符 [] 设置第 N 个值。 但是,该元素必须已经存在(pos
元素通常通过push_back、插入或调整大小(也称为分配、置换、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 不会更改容器的大小,它只会预先分配一个足够大的内部数组,以便在该容量内添加元素不需要向量重新分配。
相关文章:
- 最高有效数字侧的第N位
- 在更改for循环的第三部分后,未使用for循环结果
- 删除列表中的第n个元素
- 为什么它只打印双链接列表的第一个值,而我的程序却崩溃了
- std::find,返回所有找到的值的替代方法,而不仅仅是存在重复的向量的第一个值
- 如何使代码打印文本文件中的第一行?
- 在链表中的第 n 位插入显示分割错误
- 如何仅读取文本文件中的第一个值
- 查找不在标准中的第一个值::设置<int>最小-最大值
- 数组中所有元素的最新最小元素的第五个位置
- 圣诞节的第N天,C++递归
- 查找连续子数组的第二小和
- 在C++中打印多个矢量的第一个值
- cin语句在循环的第三次迭代中被跳过
- 如何用CMake处理只有头的第三部分
- 如何在对数时间内访问 c++ std::set 中的第 k 个元素?
- Systemc - 将sc_time四舍五入到最接近的第 10 SC_NS
- 指向多维数组的第 n 个元素的指针
- 我正在尝试在Visual Studio 2013中编写我的第一个"Hello World"代码。为什么我会收到"IntelliSense: no operator message"和"error C2
- 我可以在 c++ 中正确设置 std::vector by operator[] 的第 n 个值吗?