使用std :: remove_reference获取STL容器的元素迭代器
using std::remove_reference to get an element iterator of STL container
我正在尝试std :: remove_reference。例如,我可以提取一个元素类型的数组,但是如何获得删除_Reference以与STL容器一起使用?例如,我想使用remove_reference将迭代器返回到向量的元素:
#include <iostream>
#include <vector>
#include <type_traits>
using std::vector;
using std::cout;
using std::endl;
using std::begin;
using std::end;
using std::remove_reference;
template<typename T>
auto my_end(T& c) -> typename remove_reference<decltype(&c[0])>::type
{
return end(c)-1; //compile error when myend<vector> is instantiated
}
int main()
{
int ia[] = {1,2,3,4,5,6,7,8,10};
vector<int> v(begin(ia), end(ia));
auto my_back1 = *my_end(ia);
cout << my_back1 << endl; //prints 10
auto my_back2 = *my_end(v);
cout << my_back2 << endl; //should print 10
}
实例化my_end<vector>
时的编译器错误为:
cannot convert from 'std::_Vector_iterator<_Myvec>' to 'int *'
std::vector<T>::operator[]
返回的类型是什么?这是T&
。因此,decltype(&c[0])
的结果是T*
。
但是end(c)-1
的类型是什么?它是一个迭代器。
如果要返回迭代器,请使用decltype(end(c))
或类似的东西。
请注意,如果您只想引用最后一个元素,则可以使用(或包装):
ia.back();
如果您想要迭代器(出于某种原因),但不在乎方向:
ia.rbegin();
它也将推迟到最后一个条目。
如果容器为空,您的my_end
也不安全...但是我当然不确定您打算如何使用它。
remove_reference
的目的是什么?std::vector<T>::end()
产生迭代器,而&c[0]
产生指向元素的指针。
定义您期望的my_end()
返回的内容,然后我们可以帮助您解决问题。
如果您想要的只是返回迭代器,请这样声明:
auto my_end(T& c) -> decltype(begin(c)) { }
但是,您想尝试一下remove_reference
,对...?
感谢您的帮助。该代码在下面的评论中看起来很la脚,因此又来了。这次remove_reference
对于推论返回类型很有用,例如我需要通过迭代器。(好吧,所以它并不完全有用....)
#include <iostream>
#include <vector>
#include <type_traits>
using std::vector;
using std::cout;
using std::endl;
using std::begin;
using std::end;
using std::remove_reference;
template<typename T>
auto my_end(T It) -> typename remove_reference<decltype(It)>::type
{
return It-1;
}
int main()
{
int ia[] = {1,2,3,4,5,6,7,8,10};
vector<int> v(begin(ia), end(ia));
auto my_back1 = my_end(end(ia));
cout << *my_back1 << endl; //prints 10
auto my_back2 = my_end(end(v));
cout << *my_back2 << endl; //should print 10
}
相关文章:
- 对于set上的循环-获取next元素迭代器
- 访问要输出的矢量迭代器元素
- 为什么这个程序没有打印返回的迭代器的正确第二个元素?
- C++如何乘以包含 std::variant 元素的向量的迭代器?正在执行迭代器类型的转换?
- 调用 erase() 函数是否也会在擦除元素之前更改迭代器值?
- 为什么 min_element() 返回最小元素的索引,而不是迭代器?
- 如何通过查找迭代器结果分配给一组对的元素
- C++:在进行切片时对迭代器的约定,特别是对于访问最后一个元素并最终将其删除
- 将迭代器作为 3 个元素的滑动窗口,可以超调边界(可能使用 Boost)
- C++链表最后一个元素的迭代器?
- 使用索引与迭代器将向量迭代到倒数第二个元素
- 提升堆元素句柄比较和 MSVC 迭代器调试工具
- 如果我有一个指向矢量元素的指针,而不是迭代器,如何删除它?
- 使用迭代器打印矢量元素
- C++ std::vector语言 - 如何修改迭代器指定的元素?
- 你能pop_back一个向量,并且仍然使用迭代器到最后一个元素吗?
- 优先级队列(使用 pairs<int,int> ) 根据 for 循环迭代器的顶级元素
- C++ 当容器在使用前被破坏/修改时发出警告(通过引用元素或迭代器使用)
- 无法将 std::set 中的元素迭代器插入到 std::list
- 使用std :: remove_reference获取STL容器的元素迭代器