迭代包含向量的集合,而不使用任何基于范围的循环或引用向量

时间:2016-07-14 19:26:44

标签: c++ loops vector iterator set

假设我有一个包含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;
    }


我希望逐行显示所有矢量内容,但不使用任何上述方法。 请帮帮我,我该怎么做! 谢谢!

2 个答案:

答案 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";
}

希望有所帮助。