相关疑难解决方法(0)

cplusplus.com有什么问题?

对于这个问题,这可能不是一个非常合适的论坛,但是让我试一试,冒着被搬走的风险.

C++标准库有几个参考,包括非常有价值的ISO标准,MSDN,IBM,cppreferencecplusplus.就个人而言,在编写C++时,我需要一个具有快速随机访问,短加载时间和使用示例的引用,并且我一直在发现cplusplus.com非常有用.但是,我一直在SO上听到关于该网站的负面看法,所以我想具体说明:

cplusplus.com提供的错误,误解或错误建议有哪些?使用它来做出编码决策有哪些风险?

让我补充一点:我希望能够通过标准的准确报价在这里回答问题,因此我想发布可立即使用的链接,而cplusplus.com将是我选择的网站,如果不是这个问题.

c++

192
推荐指数
4
解决办法
2万
查看次数

当我应该使用std :: map :: at来检索map元素

我已经在stackoverflow上阅读了关于web和问题的不同文章,但对我来说,目前尚不清楚是否有更好的std::map::at用于检索map元素的情况.

根据定义,std::map::at

返回对使用键k标识的元素的映射值的引用.

如果k与容器中任何元素的键不匹配,则该函数抛出out_of_range异常.

仅限于我std::map::at在100%确定存在具有特定键的元素时值得使用的情况,否则您应该考虑异常处理.

  1. 有没有哪种情况std::map::at被认为是最有效和优雅的方式?在什么情况下你会建议使用std::map::at
  2. 我是对的,map::find()当有可能没有带有这样一个键的元素时,最好使用它吗?并且map::find()它更快,更好的方法?
if ( map.find("key") != map.end() )
{
    // found 

} else
{
    // not found
}
Run Code Online (Sandbox Code Playgroud)

PS

map::operator[] 有时可能很危险,因为如果一个元素不存在,那么它会插入它.

编辑:链接以某种方式相关链接1 链接2 链接3 链接4 链接5 链接6

c++ stdmap c++11

46
推荐指数
4
解决办法
2万
查看次数

关于如何在向量上调用清晰度改变容量,标准说了什么?

本网站暗示清除向量可能会改变容量:

http://en.cppreference.com/w/cpp/container/vector/clear

许多实现在调用clear()之后不会释放已分配的内存,从而有效地保持向量的容量()不变.

但根据@JamesKanze的说法,这是错误的,标准要求明确不会改变容量.

标准说什么?

c++ vector language-lawyer

42
推荐指数
1
解决办法
4775
查看次数

如何从STL容器中删除元素?

如何从STL容器中删除元素,具有指定或满足某些条件

对于不同类型的容器,是否有单一的通用或统一的方法?

c++ stl std c++11

39
推荐指数
1
解决办法
8857
查看次数

什么是迭代器失效?

我看到它引用了很多,但没有明确的答案,究竟是什么.我的经验是使用更高级别的语言,所以我不熟悉集合框架中存在的无效性.

什么是迭代器失效?

为什么会出现?为什么难以处理?

c++ iterator

34
推荐指数
3
解决办法
9857
查看次数

结束迭代器失效规则

关于迭代器失效规则的这个问题,很明显标准的精神意味着,例如"deque中间的擦除使所有迭代器无效并且对deque元素的引用"也指最终迭代器.

但是,我无法找到标准使其明确的任何地方,严格来说,结束迭代器不是容器中元素的迭代器.

2003年的标准是否明确了这一点?

c++ iterator

25
推荐指数
1
解决办法
2500
查看次数

std :: map thread-safety

在std :: map中引用对象是否是线程安全的?

std::map< std::string, Object >   _objects;
Run Code Online (Sandbox Code Playgroud)

map可以从许多线程更改,并且此访问是同步的,但引用只能从1个实例和线程访问的值(Object&).是否使用Object进行写操作是否安全,如果另一个线程将添加项目到映射?它会重新分配吗?

c++ multithreading stdmap map

23
推荐指数
2
解决办法
4万
查看次数

C++ 11中的过去迭代器失效

上C++最流行的交迭代器失效规则声称,目前还不清楚,如果在过去的最端迭代器(即,那些由返回end(),cend(),rend(),和crend())根据相同的规则正常迭代器,这点在元件被无效容器.这些针对2003和2011 C++的声明,推迟到讨论End迭代器失效规则的帖子,其中接受的答案表明2003标准在这个问题上是模棱两可的.这一结论是基于23.1/10评论(在的情况下swap(),这似乎暗示,当规范没有明确提及过去的最末端迭代器失效,他们可能会失效).

对该帖子的问题的评论(由mike-seymour提出)表明C++ 11在这个问题上是明确的,在deques 的情况下.我的问题是关于所有容器:

  • 在C++ 11中,是否有任何容器操作可能使过去的迭代器无效,并且这种行为在语言规范中是不明确的?

换句话说,

  • 在执行容器操作之后,我是否可以信任过去的迭代器的有效性,而不会说它可能使过去的迭代器无效?

c++ iterator

22
推荐指数
1
解决办法
2322
查看次数

C++ 11:在迭代时从std :: unordered_map中删除单个元素是否安全?

考虑在迭代时从关联容器中删除元素的规范算法:

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在迭代期间删除一个元素,我是否必须担心一些元素会被访问多次或根本不访问?

c++ iterator stl unordered-map c++11

19
推荐指数
1
解决办法
1780
查看次数

如何定义递归类型?

我想要一份清单.列表中的条目将存储值以及迭代器到列表中的另一个条目.我该如何定义这种类型?它是这样的,但在语法上是正确的.

typedef list<pair<int, MyList::const_iterator>> MyList;
Run Code Online (Sandbox Code Playgroud)

c++ c++11

19
推荐指数
2
解决办法
1920
查看次数

标签 统计

c++ ×10

c++11 ×4

iterator ×4

stdmap ×2

stl ×2

language-lawyer ×1

map ×1

multithreading ×1

std ×1

unordered-map ×1

vector ×1