Доступ к размеру элемента в векторе C ++

0

Сегодня я пробую что-то подобное в VS2012 и Max 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, но он отлично работает на Max OS, и я пробую его в Ideone.com, а также успешно выполняю, я не уверен, что что-то не так с определением размера и емкости, почему я могу получить доступ к элементу вне размера?

PS: емкость в этой ситуации на моем компьютере составляет 141 на VS2012 и 128 на Mac OS и Ideone.com

Теги:
vector
size
capacity

2 ответа

6
Лучший ответ

std::vector operator [] не будет вызывать ошибку вне диапазона. Это неопределенное поведение для доступа к элементу, превышающему размер вектора, используя оператор [].

Используйте std::vector::at вместо этого, который выбрасывает std::out_of_range

0

Врезаться в эту проблему, я пытаюсь разработать ответ от @P0W.

# 1 Элемент доступа 2d вектора

Если кто-то хочет получить доступ к элементам 2-го вектора,

Нужно сделать следующее и знать 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, вот один

пример кода

// 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;
}

выход

Out of Range error: vector::_M_range_check

Ещё вопросы

Сообщество Overcoder
Наверх
Меню