gpt4 book ai didi

c++ - 对于 std::vector,如何在没有 .resize() 的情况下使用有效的 .begin() 和 .end()?

转载 作者:太空宇宙 更新时间:2023-11-04 15:07:11 24 4
gpt4 key购买 nike

我想为我的 vector 使用一个工厂函数,并在不调用调整大小的情况下使用迭代器,这会破坏我以前的值?

有可能还是我遗漏了 STL 设计中的一点?

#include <vector>
#include <algorithm>
#include <iostream>

struct A
{
A():_x(42){}
A(double x):_x(x){}
double _x;
};

struct factory
{
A operator()()
{
return A(3.14);
}
};

int main()
{
std::vector<A> v;
int nbr = 3;
v.reserve(nbr);
std::generate_n(v.begin(), nbr, factory());

std::cout << "Good values" << std::endl;
for(int i = 0 ; i < nbr ; ++i)
std::cout << v[i]._x << std::endl;

v.resize(nbr); //How I can have the syntax below without the resize which blows my previous values ?

std::cout << "resize has been called so values are bad (i.e default ctor)" << std::endl;
for(std::vector<A>::iterator it = v.begin() ; it != v.end() ; ++it)
std::cout << (*it)._x << std::endl;
}

谢谢:)

最佳答案

要么我不太理解你的顾虑,要么你被误导了。 resize() 不会修改容器中的任何现有元素(如果您将大小调整为较小尺寸则删除的元素除外)。

现在,您的实际问题是您的程序中有未定义的行为。当您调用 generate_n 时, vector 具有 capacity() == nbrsize() == 0,这超出了容器。对此有两种解决方案,首先您可以在调用 generate_n 之前调整大小:

std::vector<A> v;
int nbr = 3;
v.resize(nbr);
std::generate_n(v.begin(), nbr, factory());

否则您可以更改迭代器的类型:

std::vector<A> v;
int nbr = 3;
v.reserve(nbr);
std::generate_n(std::back_inserter(v), nbr, factory());

关于c++ - 对于 std::vector,如何在没有 .resize() 的情况下使用有效的 .begin() 和 .end()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11416054/

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