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;