C++ 如何更改C++;STL向量 向量l; for(int i=1;i
C++ 如何更改C++;STL向量 向量l; for(int i=1;i,c++,stl,vector,C++,Stl,Vector,at和操作符[]都返回对索引元素的引用,因此您可以简单地使用: vector<int> l; for(int i=1;i<=10;i++){ l.push_back(i); } 或 这应该做到: l[4] = -1; 你可以使用 尽管@JamesMcNellis的答案是正确的,但我还是想解释一些关于错误处理的问题,以及有另一种方法来做你想做的事情的事实 有四种方法可以访问向量中的特定项: 使用[]运算符 在(…)使用成员函数 结合给定偏移量使用迭代器 使用 STD:
at
和操作符[]
都返回对索引元素的引用,因此您可以简单地使用:
vector<int> l;
for(int i=1;i<=10;i++){
l.push_back(i);
}
或
这应该做到:
l[4] = -1;
你可以使用
尽管@JamesMcNellis的答案是正确的,但我还是想解释一些关于错误处理的问题,以及有另一种方法来做你想做的事情的事实 有四种方法可以访问向量中的特定项:
- 使用
运算符[]
- 在(…)使用成员函数
- 结合给定偏移量使用迭代器
- 使用<代码> STD::FuxYu/<代码>从标准C++库的<代码>算法>代码>头。这是我可以推荐的另一种方法(它在内部使用迭代器)。例如,您可以阅读更多关于它的内容。
l[4] = -1
首先让我们看一下[]
的工作方式。它的工作方式与使用普通数组时所期望的方式几乎相同。你给出一个索引,可能你可以访问你想要的项。我说可能,因为[]
运算符不检查向量是否实际包含那么多项。这会导致无提示无效内存访问。例如:
1 2 3 4
这可能会也可能不会导致即时崩溃。最糟糕的情况当然是如果它没有,并且您实际得到的似乎是有效的值。与数组类似,这可能会导致浪费时间,试图找出原因,例如1000行代码之后,您得到的值是100
,而不是234
,这有点牵强ted到从向量中检索项目的位置
更好的方法是在(…)处使用。这将自动检查越界行为,并中断抛出std::out_of_range
。因此,在
v[10] = 9;
我们将获得:
在抛出“std::out_of_range”的实例后调用terminate
what():vector::_M_range_check:__n(10)>=this->size()
(这是4)
第三种方式类似于[]
运算符在某种意义上说,你可能会把事情搞砸。向量就像数组一样,是包含相同类型数据的连续内存块序列。这意味着你可以通过将起始地址分配给迭代器来使用它,然后只需向该迭代器添加一个偏移量。偏移量只是表示第一个ite之后的项目数m您要遍历:
v.at(10) = 9;
这也是无效的内存访问。这与在(0+偏移量)
处使用基本相同,但没有越界错误检查
我建议尽可能在(…)
处使用,这不仅是因为它比迭代器访问更具可读性,而且是因为我在上面提到的带偏移量组合的迭代器和[]
运算符的无效索引的错误检查。我更喜欢
l.at(4)=-1;
而[4]你的索引l[4]=-1;或l.at(4)有什么问题吗=-1,如果你愿意的话。你最好养成使用at
,不太惯用,但是绑定检查是无价的。@Matt:虽然越界错误往往是程序员的错误,而at
抛出异常。也就是说,断言
会更好,我认为MSVC和gcc都检查过迭代器。我们没有在我工作的地方不要使用assert
。我们有一个应该是稳定的测试环境,这样客户端就可以在上面进行测试而不会经常中断,因此我们有一个simili assert,它抛出而不是中止程序……因此at
和assert
对我有着非常相同的效果:)@米兰:事实上,这应该是边界检查,这是检查边界的行为。如果您有一个包含5个元素的向量vec
,尝试访问索引5处的元素是错误的,有效索引为0到4(包括在内),5及以上指向无元素<代码>矢量控制[5]
将。。。做点什么。可能会重新解释留在那里的任何字节,就好像它们是有效对象一样,或者更糟。这是未定义的行为,所以任何事情都可能发生,真的vec.at(5)
然而,在访问元素之前,将首先检查边界,并在本例中抛出。@MatthieuM。我明白你的意思了。所以,我创建了一个向量:std::vector vec={10,20,30,40,50}我运行了std::cout size()(5)中止(内核转储)
错误。我以前不知道这种行为。所以,非常感谢你指出这一点:)嗨,汤姆,你能告诉我如何为2D向量实现这一点吗,比如“向量VC”或“向量VC(100100)”。
1 2 3 4
v[10] = 9;
v.at(10) = 9;
std::vector<int>::iterator it = v.begin(); // First element of your vector
*(it+0) = 9; // offest = 0 basically means accessing v.begin()
// Now we have 9 2 3 4 instead of 1 2 3 4
*(it+1) = -1; // offset = 1 means first item of v plus an additional one
// Now we have 9 -1 3 4 instead of 9 2 3 4
// ...
*(it+10) = 9;