对于这个问题,这可能不是一个非常合适的论坛,但是让我试一试,冒着被搬走的风险.
C++标准库有几个参考,包括非常有价值的ISO标准,MSDN,IBM,cppreference和cplusplus.就个人而言,在编写C++时,我需要一个具有快速随机访问,短加载时间和使用示例的引用,并且我一直在发现cplusplus.com非常有用.但是,我一直在SO上听到关于该网站的负面看法,所以我想具体说明:
cplusplus.com提供的错误,误解或错误建议有哪些?使用它来做出编码决策有哪些风险?
让我补充一点:我希望能够通过标准的准确报价在这里回答问题,因此我想发布可立即使用的链接,而cplusplus.com将是我选择的网站,如果不是这个问题.
我已经在stackoverflow上阅读了关于web和问题的不同文章,但对我来说,目前尚不清楚是否有更好的std::map::at
用于检索map元素的情况.
根据定义,std::map::at
返回对使用键k标识的元素的映射值的引用.
如果k与容器中任何元素的键不匹配,则该函数抛出out_of_range异常.
仅限于我std::map::at
在100%确定存在具有特定键的元素时值得使用的情况,否则您应该考虑异常处理.
std::map::at
被认为是最有效和优雅的方式?在什么情况下你会建议使用std::map::at
?map::find()
当有可能没有带有这样一个键的元素时,最好使用它吗?并且map::find()
它更快,更好的方法?Run Code Online (Sandbox Code Playgroud)if ( map.find("key") != map.end() ) { // found } else { // not found }
PS
map::operator[]
有时可能很危险,因为如果一个元素不存在,那么它会插入它.
本网站暗示清除向量可能会改变容量:
http://en.cppreference.com/w/cpp/container/vector/clear
许多实现在调用clear()之后不会释放已分配的内存,从而有效地保持向量的容量()不变.
但根据@JamesKanze的说法,这是错误的,标准要求明确不会改变容量.
标准说什么?
如何从STL容器中删除元素,具有指定值或满足某些条件?
对于不同类型的容器,是否有单一的通用或统一的方法?
我看到它引用了很多,但没有明确的答案,究竟是什么.我的经验是使用更高级别的语言,所以我不熟悉集合框架中存在的无效性.
什么是迭代器失效?
为什么会出现?为什么难以处理?
关于迭代器失效规则的这个问题,很明显标准的精神意味着,例如"deque中间的擦除使所有迭代器无效并且对deque元素的引用"也指最终迭代器.
但是,我无法找到标准使其明确的任何地方,严格来说,结束迭代器不是容器中元素的迭代器.
2003年的标准是否明确了这一点?
在std :: map中引用对象是否是线程安全的?
std::map< std::string, Object > _objects;
Run Code Online (Sandbox Code Playgroud)
map可以从许多线程更改,并且此访问是同步的,但引用只能从1个实例和线程访问的值(Object&).是否使用Object进行写操作是否安全,如果另一个线程将添加项目到映射?它会重新分配吗?
上C++最流行的交迭代器失效规则声称,目前还不清楚,如果在过去的最端迭代器(即,那些由返回end()
,cend()
,rend()
,和crend()
)根据相同的规则正常迭代器,这点在元件被无效容器.这些针对2003和2011 C++的声明,推迟到讨论End迭代器失效规则的帖子,其中接受的答案表明2003标准在这个问题上是模棱两可的.这一结论是基于23.1/10评论(在的情况下swap()
,这似乎暗示,当规范没有明确提及过去的最末端迭代器失效,他们可能会失效).
对该帖子的问题的评论(由mike-seymour提出)表明C++ 11在这个问题上是明确的,在deque
s 的情况下.我的问题是关于所有容器:
换句话说,
考虑在迭代时从关联容器中删除元素的规范算法:
for (auto iter = myMap.begin(); iter != myMap.end(); )
{
if (/* removal condition */)
{
iter = myMap.erase(iter);
}
else
{
++iter;
}
}
Run Code Online (Sandbox Code Playgroud)
在使用C++ 11 std::unordered_map
容器时,我一直在不加思索地应用这个算法.但是,在浏览cppreference.comstd::unordered_map::erase
上的文档之后,在阅读以下注释后我变得有点担心:
保留未擦除元素的顺序(这使得可以在迭代容器时擦除单个元素)(从C++ 14开始)
基于这个陈述,我假设在C++ 14标准中添加了语言,以确保库实现者在调用后保证排序std::unordered_map::erase
.例如,这样的要求可能会限制实现在删除元素后不重新整理整个容器,而只是允许它从相应的存储桶中删除元素?
如果我在C++ 11中没有这样的保证,并且如果我希望我的代码是可移植的,那么如果我std::unordered_map
在迭代期间删除一个元素,我是否必须担心一些元素会被访问多次或根本不访问?
我想要一份清单.列表中的条目将存储值以及迭代器到列表中的另一个条目.我该如何定义这种类型?它是这样的,但在语法上是正确的.
typedef list<pair<int, MyList::const_iterator>> MyList;
Run Code Online (Sandbox Code Playgroud)