1

我有vector<vector<int> > tchSubVec

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

此外,.tchSubVec[i].

这是完整的代码:

 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

4 回答 4

1

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

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

顺便说一句,如果你可以使用 C++11,它会大大简化迭代:

for (auto &vec : tchSubVec) {
    /* ... */
}
于 2013-11-08T19:14:01.223 回答
1

因为i是一个vector<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];

但是你不能混合它们。

于 2013-11-08T19:14:59.297 回答
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];
  //              ^^^^     

注意这里it是 a char**,不是积分。您使用带索引的积分,而不是指针。

您真正想要做的是取消引用迭代器:

vector<int>& vec = *i;
于 2013-11-08T19:18:12.467 回答
1

迭代器和operator[]. 您不能将迭代器与operator[]. 要获取迭代器指向的值,您需要使用取消引用运算符 ( 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 << ", ";
    }
}
于 2013-11-08T19:20:41.030 回答