Это вектор векторов или вектор указателей на векторы? Ваш код должен работать как рекламируется :
typedef std::vector<int> vec_int;
typedef std::vector<vec_int> multi_int;
multi_int m(10, vec_int(10));
m.at(2).at(2) = /* ... */;
m[2][1] = /* ... */;
Но ваш код выглядит так:
typedef std::vector<vec_int*> multi_int; // pointer!
multi_int* m; // more pointer!
Если у вас есть указатели, вам нужно сначала разыменовать их, чтобы использовать operator[]
:
(*(*m)[2])[2] = /* ... */;
Это может быть ужасно. Возможно временно использовать ссылки:
multi_int& mr = m;
(*mr[2])[2] = /* ... */;
Хотя это все еще некрасиво. Может быть полезны бесплатные функции:
template <typename T>
typename T::value_type& access_ptr(T* pContainer,
unsigned pInner, unsigned pOuter)
{
return (*(*pContainer)[pInner])[pOuter]);
}
access_ptr(m, 2, 2) = /* ... */
Однако наиболее предпочтительным является избавление от указателей . Указатели могут просачиваться и вызывать всевозможные проблемы, например утечку при возникновении исключений. Если вы должны использовать указатели, используйте контейнер указателя от boost для внутреннего вектора и сохраните фактический объект в интеллектуальном указателе .
Кроме того, ваш заголовок немного вводит в заблуждение. Разница между at
и operator[]
заключается в том, что at
выполняет проверку диапазона. В остальном они одинаковые.