试图让Vector迭代器以不同的顺序进行迭代
Trying to get Vector iterator to iterating in a different order
我的问题有两个:
-
我有一个对象向量和一个整数向量,我想按整数向量的顺序迭代我的对象向量:
这意味着如果
{water,juice,milk,vodka}
是我的对象向量,{1,0,3,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;
}
- 顺序容器和迭代器算术
- 在C++中,是否可以在单个循环中顺序迭代多个迭代器
- 基于 C++ 范围的 std::vector 迭代的顺序
- 有没有办法在不使用任何迭代的情况下将字符的字母顺序排列
- 使用 boost::filesystem 迭代目录时可以更改文件的顺序吗?
- 确定设置迭代器的顺序
- 如何按顺序迭代几个容器
- QDiriterator迭代顺序
- 二进制搜索树中按顺序遍历的复杂性(使用迭代器)
- 迭代器是否以相同的顺序迭代 boost::unordered_set 或 boost::unordered_map 只要集合不变?
- unordered_map同一键的迭代顺序
- 是STL RBTree顺序迭代O(N ln N)
- std::unordered_set元素的迭代顺序保证始终相同
- 如何编写一个迭代器包装器来组合底层迭代器中的顺序值组
- 按排序顺序迭代 std::vector
- 是否可以按值顺序迭代映射
- 以相反的顺序迭代可变模板参数
- 使用自定义顺序迭代boost multi_index
- 如何按照我自己的顺序/它们被插入的顺序迭代std::map值
- 排序的数据结构,用于按顺序迭代、有序推送和删除(仅从顶部开始 N 个元素)