第一个问题:是否可以使用自动“强制”const_iterator
?
例如:
map<int> usa;
//...init usa
auto city_it = usa.find("New York");
我只想查询,而不是更改city_it
指向的任何内容,因此我希望city_it
为map<int>::const_iterator
。但是,通过使用自动,city_it
与map::find()
的返回类型相同,即map<int>::iterator
。有什么建议吗?
答案 0 :(得分:34)
很抱歉,但我认为最好使用auto
,因为您想要执行(隐式有效)类型转换。 auto
用于推断确切类型,这不是您想要的。
只需这样写:
std::map<std::string, int>::const_iterator city_it = usa.find("New York");
正如MooingDuck正确指出的那样,使用类型别名可以提高代码的可读性和可维护性:
typedef std::map<std::string, int> my_map;
my_map::const_iterator city_it = usa.find("New York");
答案 1 :(得分:12)
与@ Jollymorphic的答案相比,这与转换为const
并没有太大的不同,但我认为拥有像这样的实用单行函数非常方便:
template<class T> T const& constant(T& v){ return v; }
这使得转换对眼睛更具吸引力:
auto it = constant(usa).find("New York");
// other solutions for direct lengths comparision
std::map<std::string, int>::const_iterator city_it = usa.find("New York");
auto city_it = const_cast<const std::map<std::string, int>&>(usa).find("New York");
嗯,我会说,更大并不总是更好。您当然可以根据自己的偏好选择功能名称 - as_const
或const_
只是可能的选择。
答案 2 :(得分:6)
使用auto的另一种变体(保持可变的美国和const美国):
map<std::string, int> usa;
//...init usa
const auto &const_usa = usa;
auto city_it = const_usa.find("New York");
如果您在初始化后根本不需要地图可变,那么还有其他一些选项。
你可以将usa定义为const并使用函数调用来启动它:
const map<std::string, int> usa = init_usa();
auto city_it = usa.find("New York");
或使用lambda初始化const映射:
const auto usa = [&]()->const map<std::string, int>
{
map<std::string, int> usa;
//...init usa
return usa;
}();
auto city_it = usa.find("New York");
答案 3 :(得分:6)
一个干净的解决方案是使用 const 引用其他可修改的地图:
const auto &const_usa = usa;
auto city_it = const_usa.find("New York");
这将确保您无法修改const_usa
,并将使用const迭代器。
答案 4 :(得分:5)
从C ++ 17开始,您可以像这样使用std::as_const
:
SELECT A.ID, A.place, A.receipt, D.State, A.service, B.Description, C.ID, C.receipt, C.Source
FROM B, (A LEFT JOIN C ON A.receipt = C.receipt), D;
答案 5 :(得分:1)
我现在无法对此进行测试,但我认为这样做可以解决问题:
auto city_it = const_cast< const map<int> & >(usa).find("New York");
答案 6 :(得分:0)
在C ++ 11中,您可以执行以下操作:
decltype(usa)::const_iterator city_it = usa.find("New York");
答案 7 :(得分:-2)
您可以使用auto来“跟踪”某种类型或“推断”某种类型:
// deduce
auto city_it = usa.find("New York");
// track
auto city_it = std::map<int>::const_iterator( usa.find("New York"));
另外,Watch是Herb Sutter的现代c ++风格讲座,涵盖了大部分类型演绎指南。 https://youtu.be/xnqTKD8uD64