- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在将两个现有函数转换为模板,这两个函数检查迭代器是否是 std::map
中的最后一项和倒数第二项。 isLastItem
模板编译,isSecondLastItem
失败并出现我不理解的错误消息。
导致错误的一行是 typename T::reverse_iterator secondLastIt = collection.rbegin();
但是模板和非模板版本看起来是一样的。
typedef std::map<time_t, std::string> TInfoMap;
class MainClass
{
public:
MainClass() {};
void test();
private:
/* Doesn't work */
template <typename T>
bool
isSecondLastTemplate(const T &collection, const typename T::const_iterator &searchItem)
{
typename T::reverse_iterator secondLastIt = collection.rbegin();
return true;
}
/* this works */
bool
isSecondLastNoTemplate(const TInfoMap &infoMap, const TInfoMap::const_iterator &searchItem)
{
TInfoMap::reverse_iterator secondLastIt = infoMap.rbegin();
return true;
}
/* This works */
template <typename T>
bool
isLastItem(const T &collection, const typename T::const_iterator &searchItem)
{
if (collection.size() == 1)
return true;
// point to last item
typename T::const_iterator lastItem = collection.end();
--lastItem;
return searchItem == lastItem;
}
private:
TInfoMap mInfoMap;
};
void
MainClass::test()
{
mInfoMap[1] = "One";
mInfoMap[2] = "Two";
mInfoMap[3] = "Three";
TInfoMap::iterator it = mInfoMap.begin();
if (isLastItem(mInfoMap, it))
printf("Last Item!\n");
if (isSecondLastTemplate(mInfoMap, it))
printf("Second Last!\n");
if (isSecondLastNoTemplate(mInfoMap, it))
printf("Second Last!\n");
}
int
main(int argc, char **argv)
{
MainClass theStuff;
theStuff.test();
}
编译器错误:
In constructor ‘std::reverse_iterator<_Iterator>::reverse_iterator(const std::reverse_iterator<_Iter>&)
[with _Iter = std::_Rb_tree_const_iterator<std::pair<const long int, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >,
_Iterator = std::_Rb_tree_iterator<std::pair<const long int, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >]’:
junk3.cpp:19: instantiated from here
error: no matching function for call to ‘std::_Rb_tree_iterator<std::pair<const long int, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::_Rb_tree_iterator(std::_Rb_tree_const_iterator<std::pair<const long int, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >)’
candidates are:
std::_Rb_tree_iterator<_Tp>::_Rb_tree_iterator(std::_Rb_tree_node<_Tp>*) [with _Tp = std::pair<const long int, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >]
std::_Rb_tree_iterator<_Tp>::_Rb_tree_iterator() [with _Tp = std::pair<const long int, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >]
std::_Rb_tree_iterator<std::pair<const long int, std::basic_string<char, std::char_traits<char>,
std::allocator<char> > > >::_Rb_tree_iterator(const std::_Rb_tree_iterator<std::pair<const long int, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&)
最佳答案
你需要一个 const_reverse_iterator
因为 collection
是 const
template <typename T>
bool
isSecondLastTemplate(const T &collection, const typename T::const_iterator &searchItem)
{
typename T::const_reverse_iterator secondLastIt = collection.rbegin();
^^^^^^^^^^^^^^^^^^^^^^
return true;
}
关于c++ - 集合中倒数第二个的模板; reverse_iterator 不编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41020416/
让它成为 std::list::iterator 和 std::list::reverse_iterator。反向是从正向派生的吗?如果不是,那么为什么 list 的成员函数没有反向等价物? 提前致谢
这个问题在这里已经有了答案: 关闭10 年前。 Possible Duplicate: Why does a push_back on an std::list change a reverse i
我有一个包含和管理一系列对象的类。为了避免泄露这些对象的存储方式,同时允许迭代它们,我决定使用 boost::any_iterator 进行类型删除。 using my_erased_type_it
关于 the cppreference page of reverse_iterator我发现以下评论 std::reverse_iterator does not work with iterato
我正在尝试为我的迭代器和 const_iterator 类实现反向迭代器适配器,但遇到了一些麻烦。如果有人可以指导我解决这个问题,将不胜感激! 我的想法是我应该能够从我的 rbegin() 和 ren
我正在尝试编写包含一些遗留代码的二次算法。我想两次穿过一个特定的容器,一次按顺序,一次按相反的顺序。显然,我的第一个想法是使用 iterator 和 reverse_iterator,但奇怪的是,我正
有没有办法检查作为 arg 传递给 fnc 的迭代器是否是 reverse_iterator?我可以使用任何迭代器特征函数吗? 最佳答案 用偏特化来写很简单: #include #include
这是使用 std::reverse_iterator 的代码示例: template class Stack { T arr[SIZE]; size_t pos = 0; public
我正在尝试使用该算法构建哈夫曼树,但我已经走到了某种死胡同。我首先将字符串作为用户输入,然后找到输入的实际位表示以与压缩位序列进行比较。然后我使用 std::map 将字母映射到它们的频率。现在我要做
我天真地期望这个程序能够编译并运行成功: #include #include int main() { const std::string s = "foo"; auto forw
最近我在维护的代码中发现了以下内容: for (reverse_iterator rit = base_container::rbegin(); rit != base_container::rend
我正在将两个现有函数转换为模板,这两个函数检查迭代器是否是 std::map 中的最后一项和倒数第二项。 isLastItem 模板编译,isSecondLastItem 失败并出现我不理解的错误消息
我刚刚学习 STL,reverse_iterator 让我感到困惑。它有一个默认构造函数,但我不知道如何使用它。我试过: reverse_iterator r{}; r --; 然后程序崩溃了。我认为
我在使用 gcc 的非 const 容器上使用 const 反向迭代器时遇到问题。好吧,只有某些版本的 gcc。 #include #include using namespace std; in
最近,用户@Mooing Duck 设计了concatenated_range ,一个优雅的自定义迭代器,解决了“链接”两个迭代器的问题,一切都在幕后。 它非常适合预期用途: auto range0=
我实现了一个双向迭代器,但它不是对数据结构进行操作,而是返回一个可以在两个方向上迭代计算的数学序列。事实上,我正在迭代整数,使用++ 和 -- 在 int 上。这意味着数据不会存储在不同的结构中,因此
这个问题在这里已经有了答案: Can I convert a reverse iterator to a forward iterator? (5 个答案) 关闭 4 年前。 我想在 for 循环中
似乎迭代器适配器 reverse_iterator 双重定义了它的大部分嵌套类型。特别是,它公开继承自 std::iterator,它公开了 iterator_category、value_type、
我有一个方法应该迭代 map向前或向后,取决于条件。操作本身与方向无关,因此我希望能够做这样的事情: std::map some_map; auto iter = some_condition ? s
boost 的文档 specialized iterator adaptors声明 boost::reverse_iterator “纠正了 C++98 的 std::reverse_iterator
我是一名优秀的程序员,十分优秀!