foo [i]和foo-> at(i)与stl向量之间的差异

Mar*_*ark 3 c++ stl vector

有什么理由吗?

foo =(bar-> at(x)) - > at(y);

工作,但

foo = bar [x] [y];

不起作用,其中bar是向量的向量(使用c ++ stl)

声明是:

std :: vector <std :: vector <Object*>*>

GMa*_*ckG 9

它是向量的向量还是向量的指针向量?您的代码应该像宣传的那样工作:

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] = /* ... */;
Run Code Online (Sandbox Code Playgroud)

但是你的代码似乎有:

typedef std::vector<vec_int*> multi_int; // pointer!
multi_int* m; // more pointer!
Run Code Online (Sandbox Code Playgroud)

如果你有指针,你需要首先取消引用它们operator[]:

(*(*m)[2])[2] = /* ... */;
Run Code Online (Sandbox Code Playgroud)

这可能是丑陋的.也许临时使用参考:

multi_int& mr = m;
(*mr[2])[2] = /* ... */;
Run Code Online (Sandbox Code Playgroud)

虽然那仍然有些难看.也许免费功能很有帮助:

template <typename T>
typename T::value_type& access_ptr(T* pContainer,
                                    unsigned pInner, unsigned pOuter)
{
    return (*(*pContainer)[pInner])[pOuter]);
}

access_ptr(m, 2, 2) = /* ... */
Run Code Online (Sandbox Code Playgroud)

但最可取的是摆脱指针.指针可能会泄漏并出现各种问题,例如在抛出异常时泄漏.如果必须使用指针,请使用boost中的指针容器作为内部向量,并将实际对象存储在智能指针中.

此外,你的标题有点误导.at和之间的区别operator[]at范围检查.否则,他们是一样的.

  • 它需要是`std :: vector <std :: vector <T>*>*`,有两个` - >`. (2认同)