int流行传染媒介从传染媒介的

时间:2013-11-08 19:11:37

标签: c++ vector

我有vector<vector<int> > tchSubVec

我不明白为什么我不能执行这一行:vector<int>& vec = tchSubVec[i];

在将.放在tchSubVec[i]的末尾时,我也无法从IDE获得任何建议。

这是完整的代码:

 for(vector<vector<int> >::iterator i = tchSubVec.begin(); i < tchSubVec.end(); i++)
    {
        cout << "Subjects of teacher " << distance(tchSubVec.begin(), i) << " : \n";
        vector<int>& vec = tchSubVec[i];
        for(vector<int>::iterator j =  vec.begin(); j < vec->end(); j++)
        {
            cout << vec[i] << ", ";
        }
    }

代码有什么问题?

4 个答案:

答案 0 :(得分:1)

::iterator与索引不同。您无法在[]运算符中使用迭代器。相反,只需取消引用它。这是有效的,因为迭代器有*运算符重载。

for(vector<vector<int> >::iterator i = tchSubVec.begin(); i < tchSubVec.end(); i++) {
    vector<int>& vec = *i;
}

顺便说一句,如果你可以使用C ++ 11,它可以减轻迭代次数:

for (auto &vec : tchSubVec) {
    /* ... */
}

答案 1 :(得分:1)

因为ivector<vector<int>>::iterator,而不是size_t(无符号整数)。

使用迭代器:

vector<int>& vec = *i;
/* or just use i directly, like:
   for (vector<int>::iterator j = i->begin(); j != i->end(); ++j)
*/

或使用索引:

for (size_t i = 0; i < tchSubVec.size(); ++i) {
    vector<int>& vec = tchSubVec[i];

但你不能混合它们。

答案 2 :(得分:1)

vector<int>& vec = tchSubVec[i];

你混淆了两个概念:索引寻址和迭代器。它们是相关但不相同的,不可互换。

i这里是iterator,其使用方式类似于指针。这就好像你这样做:

char** bufs = new char* [256];
for (size_t i = 0; i : 256; ++i)
  bufs[i] = new char [1024];

/// ... then ...

for (char** it = bufs; it < bufs+256; ++it)
  char* buf = bufs[it];
  //              ^^^^     

请注意,itchar**,而非整数。您使用带索引的积分,而不是指针。

您实际想要做的是取消引用迭代器:

vector<int>& vec = *i;

答案 3 :(得分:1)

迭代器与operator[]之间存在误解。您不能使用operator[]的迭代器。要获取迭代器指向的值,您需要使用de-reference运算符(operator*)。

typedef std::vector<std::vector<int> >::iterator iter;
iter begin = tchSubVec.begin();
iter end = tchSubVec.end();
for(iter it = begin; it != end; ++it) {
    cout << "Subjects of teacher " << distance(begin, it) << " : \n";
    vector<int>& vec = *it;
    typedef std::vector<int>::iterator iter2;
    iter2 end2 = vec.end();
    for(iter2 it2 = vec.begin(); it2 != end2; ++it2) {
        cout << *it2 << ", ";
    }
}