假设我有一个包含n个不同大小的矢量的集合。
我想迭代它们而不使用任何基于范围的循环。
我该怎么做!
//例如,这可行,但我在这里使用了基于范围的循环
set < vector <int> > fset;
for(auto it : fset)
{
for(auto itt : it)
cout << itt << " ";
cout << endl;
}
//这也有效,但我使用了i作为向量引用和迭代索引
set < vector <int> > fset;
for(set < vector <int> > :: iterator it=fset.begin();it!=fset.end();++it)
{
const vector < int >& i = (*it);
int l = i.size();
for(int j=0; j<l; ++j)
cout << i[j] << " ";
cout << endl;
}
我希望逐行显示所有矢量内容,但不使用任何上述方法。 请帮帮我,我该怎么做! 谢谢!
答案 0 :(得分:1)
需要C ++ 14(但也可以轻松转换为C ++ 11)
#include <iostream>
#include <ostream>
#include <iterator>
#include <set>
#include <vector>
int main() {
std::set<std::vector<int>> svec = {
{1,2,3},
{4,5,6}
};
std::for_each(std::begin(svec), std::end(svec),
[](const auto& vec) {
std::copy(std::begin(vec), std::end(vec),
std::ostream_iterator<int>(std::cout, " "));
std::cout << '\n';
});
return 0;
}
答案 1 :(得分:0)
根据我的理解,这应该打印你的矢量集:
set <vector <int> > data;
for (const auto& row : data)
{
for (int value : row)
cout << value << ", ";
cout << "\n";
}
您可以轻松调整内循环中矢量元素之间的格式,以及内循环之前或之后行的开头或结尾所需的任何格式。
使用迭代器:
for (auto row_it = data.begin(); row_it != data.end(); ++row_it)
{
for (auto value_it = row_it->begin(); value_it != row_it->end(); ++value_it)
cout << *value_it << ", ";
cout << "\n";
}
这两件事完全相同。 ranged-for仅通过添加类似
的内容来添加间接级别int value = *value_it;
在内循环的开头。
希望这有帮助。
(哎呀。修正了错字。)
最终修改
如果你想避免使用auto
,我猜你会被旧的C ++编译器(C ++ 98或C ++ 03,基本上是同一件事)所困扰。
要正确命名迭代器,您需要考虑它们所代表的类型。这里不明显的只是查看代码, 你可能无法修改集合的值 。因此,所有内部迭代器必须为const
。
但是,既然你只是打印集合本身,你也可以是显式的,也可以使用const迭代器作为外部循环。
for (set <vector <int> > ::const_iterator row_it = data.begin(); row_it != data.end(); ++row_it)
{
for (vector <int> ::const_iterator value_it = row_it->begin(); value_it != row_it->end(); ++value_it)
cout << *value_it << ", ";
cout << "\n";
}
希望有所帮助。