访问元件出大小的在C ++矢量

问题描述 投票:2回答:2

今天我尝试这样的事情在VS2012和Mac OS 10.7

    vector<int> vec;
    vector<int> vec2;
    for(int i = 0;i < 100 ;i++){
        vec.push_back(i);
    }

    cout << "size: " << vec.size() << endl;
    cout << "capacity: " << vec.capacity() << endl;
    cout << vec[127] << endl;
    //vec2.reserve(10);
    fill_n(vec.begin(),128,-1);
    cout << vec[127] << endl;
    return 0;

因为我们知道向量的大小是在容器中的元素的实数,上面的代码会导致VS2012运行时错误,但它工作正常上最大的操作系统,我尝试在Ideone.com并成功运行,我不知道如果有什么不对的尺寸和容量的定义,为什么我可以访问元素进行尺寸的?

PS:在我的电脑上这种情况的容量为141 VS2012和128在Mac OS和Ideone.com

c++ vector size capacity
2个回答
8
投票

std::vector操作[]不会引发任何超出范围的错误。这是一个不确定的行为来访问元素比使用[]运营商的矢量大小。

使用std::vector::at相反,会抛出std::out_of_range


0
投票

碰到这个问题,我尝试从@ P0W阐述了答案。

二维矢量的#1访问元件(S)

如果有人想访问2D向量的元素,

一个应该做到以下几点,并意识到API 2dvector.at(row#).at(col#)

#include <vector>
#include <iostream>
using namespace std;

int main() {
    vector <vector<int> > vi;
    vi.push_back( vector <int>() );    // add empty 1d vector
    vi.at(0).push_back( 1 );           // push 1st element
    cout << vi.at(0).at(0) << endl;    // access element of 2d vector and prints 1
    vi.at(0).at(0) = 2;                // change number
    cout << vi.at(0).at(0) << endl;    // access element of 2d vector and prints 2
}

#2 std::out_of_range

如果您有困难找到std::out_of_range的例子,这里是一个

example code

// out_of_range example
#include <iostream>       // std::cerr
#include <stdexcept>      // std::out_of_range
#include <vector>         // std::vector

int main (void) {
  std::vector<int> myvector(10);
  try {
    myvector.at(20)=100;      // vector::at throws an out-of-range
  }
  catch (const std::out_of_range& oor) {
    std::cerr << "Out of Range error: " << oor.what() << '\n';
  }
  return 0;
}

output

Out of Range error: vector::_M_range_check
© www.soinside.com 2019 - 2024. All rights reserved.