我有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] << ", ";
}
}
代码有什么问题?
答案 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)
因为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];
但你不能混合它们。
答案 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];
// ^^^^
请注意,it
是char**
,而非整数。您使用带索引的积分,而不是指针。
您实际想要做的是取消引用迭代器:
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 << ", ";
}
}