试图让Vector迭代器以不同的顺序进行迭代



我的问题有两个:

  1. 我有一个对象向量和一个整数向量,我想按整数向量的顺序迭代我的对象向量:

    这意味着如果{water,juice,milk,vodka}是我的对象向量,{1,0,3,2}是我的整数向量,我希望我的对象矢量有一个常量迭代器,第一个对象有果汁,第二个对象有水,伏特加和最后一个牛奶。

    有简单的方法吗?

  2. 假设我有一个函数将常量迭代器(itr)返回到未知(但可访问)向量意思是,我可以使用(itr.getvalue()),但我没有迭代向量的大小,有没有一种方法可以进行while循环,并通过迭代器的方式知道结束或向量?

问题1:

省略了正确迭代器所需的大部分样板,以下是它的工作方式:

template<typename Container, typename Iterator>
class index_iterator
{
public:
  typedef typename Container::value_type value_type;
  index_iterator(Container& c, Iterator iter):
    container(c),
    iterator(iter)
  {
  }
  value_type& operator*() { return container[*iterator]; }
  index_iterator& operator++() { ++iterator; return *this; }
  bool operator==(index_iterator const& other)
  {
    return &container == &other.container && iterator == other.iterator;
  }
  // ...
private:
  Container& container;
  Iterator iterator;
};
template<typename C, typename I>
 index_iterator<C, I> indexer(C& container, I iter)
{
  return index_iterator<C, I>(container, iter);
}

然后你可以写例如

std::vector<std::string> vs;
std::vector<int> vi
// fill vs and vi
std::copy(indexer(vs, vi.begin()),
          indexer(vs, vi.end()),
          std::ostream_iterator<std::string>(std::cout, " "));

问题2:

不,这是不可能的。

1

#include <iostream>
#include <vector>
std::vector<std::string>  foods{"water", "juice", "milk", "vodka"};
std::vector<unsigned int> indexes{1,0,3,2};
for (int i : indexes) { // ranged-for; use normal iteration if you must
   std::cout << foods[i] << " ";
}
// Output: juice water vodka milk 

现场演示

如果您真的想将这种行为封装到foods的单个迭代器中,这是可以做到的,但会变得有点复杂。


2

假设我有一个函数将const迭代器(itr)返回到未知(但可访问)的向量,也就是说,我可以使用(itr.getvalue()),但我没有迭代向量的大小,有没有办法进行while循环,并通过迭代器的方式知道结束或向量?

如果你没有向量的大小,也没有向量的结束迭代器,那么,不,你不能。只使用一个迭代器无法可靠地对任何内容进行迭代;你需要一双鞋或一段距离。

其他人已经涵盖了数字1。对于数字2,它基本上归结为一个问题,即你愿意称之为迭代器。当然,可以定义一个类,该类将大致执行您所要求的操作——一个既表示当前位置又有某种方法来确定何时尽可能增加的单个对象。

不过,大多数人会把它称为range,而不是迭代器。您必须使用与普通迭代器有所不同的迭代器。大多数迭代器都是通过显式地将它们与表示范围末尾的另一个迭代器进行比较来使用的。在这种情况下,当您创建"迭代器"时,您将传递两个单独的位置(一个用于开始/当前位置,另一个用于结束位置),并且您将重载operator bool(用于最明显的选择),以指示当前位置是否已递增超过结束位置。您可以使用类似于while (*my_iterator++) operator_on(*my_iterator);的方法——这与使用普通迭代器有很大不同。

我希望为我的对象向量有一个const迭代器,它将第一个物体的汁液

typedef std::vector<Drink> Drinks;
Drinks drinks;
drinks.push_back("water");
drinks.push_back("juice");
drinks.push_back("milk");
drinks.push_back("vodka");
Drinks::const_iterator i = drinks.begin();

const迭代器(itr)到未知(但可访问)向量

Drinks::const_iterator itr = some_func();
while (itr != drinks.end()) {
   doStuff;
   ++itr;
}

最新更新