来自矢量的 int 的流行矢量

Pop vector of int from vector

本文关键字:流行 int      更新时间:2023-10-16

我有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] << ", ";
        }
    }

代码有什么问题?

迭代器和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 << ", ";
    }
}
::iterator

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

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

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

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

因为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];

但你不能混合它们。

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是一个char**,而不是一个积分。 您将积分与索引一起使用,而不是指针。

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

vector<int>& vec = *i;