vector<vector<string> > vvs;
vector<string> vs;
vs.push_back("r1-c1");
vs.push_back("r1-c2");
vs.push_back("r1-c3");
vvs.push_back(vs);
for (vector<vector<string> >::iterator vvsi = vvs.begin(); vvsi != vvs.end(); vvsi++) {
vector<string> vec_str = *vvsi;
for (vector<string>::iterator vsi = vec_str.begin(); vsi != vec_str.end(); vsi++) {
cout << *vsi << ", ";
}
cout << "\n";
}
在上面的 C++ 代码中,为了避免 vector(vector vec_str = *vvsi) 的复制,我尝试了下面的代码
vector<string> *vec_str = vvsi.base(); //Working. which (returns a const pointer&)
vector<string> *vec_str = &(*vvsi); //Working. Assigning the address
但是
vector<string> *vec_str = vvsi; //Error. Not able to assign
错误
(build error : cannot convert 'std::vector<std::vector<std::basic_string<char> > >::iterator to 'std::vector<std::basic_string<char> >*' in initialization)
以整数为例
int a=10;
int *b = &a; //working. Assigning address
int *c = &(*b); //working. Assigning address
int *d = b; //working. Assigning address
*c=11;
std::cout << a<<"\n";
*d=12;
std::cout << a<<"\n";
在 vector 的情况下,为什么在赋值时构建错误(无法从 C++ 迭代器文档中理解)?
最佳答案
迭代器不是指针。它的接口(interface)被用作指针,但它肯定不是指针。
但是,如果您只是想遍历父 vector 中每个 vector 的元素,则无需将其分配给临时 vector 或指针,迭代器本身就足够了:
for (vector<vector<string> >::iterator vvsi = vvs.begin(); vvsi != vvs.end(); ++vvsi) {
for (vector<string>::iterator vsi = vvsi->begin(); vsi != vvsi->end(); ++vsi) {
cout << *vsi << ", ";
}
cout << "\n";
}
此外,由于您将 c++11 作为问题中的标签,我认为您可能对更现代的表达方式感兴趣:
for(auto& vst : vvs){
for(auto& st : vst){
cout << st << ", ";
}
cout << endl;
}
关于C++ 编程 : Error when assigning the iterator to vector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31924515/