第一个问题:是否可以使用auto“强制”const_iterator
?例如:
map<int> usa;
//...init usa
auto city_it = usa.find("New York");
我只想查询,而不是更改city_it
所指向的任何内容,所以我希望city_it
为map<int>::const_iterator
。但是通过使用auto,city_it
与map::find()
的返回类型是相同的,即map<int>::iterator
。有什么建议吗?
发布于 2017-07-12 20:21:28
由于使用了C++17,您可以像这样使用std::as_const
:
#include <utility>
// ...
auto city_it = std::as_const(usa).find("New York");
发布于 2013-03-06 05:07: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_
是可能的选择。
发布于 2013-03-13 00:57:37
另一个使用auto的变体(同时保留可变usa和常量usa):
map<std::string, int> usa;
//...init usa
const auto &const_usa = usa;
auto city_it = const_usa.find("New York");
如果在初始化后根本不需要map是可变的,那么还有一些其他的选择。
您可以将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");
https://stackoverflow.com/questions/15233188
复制相似问题