草庐IT

c++ - 我将如何在 C++20 中传递范围而不是迭代器对?

我听说C++20将支持作用于范围,而不仅仅是开始+结束迭代器对。这是否意味着,在C++20中,我将能够编写:std::vectorvec=get_vector_from_somewhere();std::sort(vec);std::vectorhalves;halves.reserve(vec.size());std::transform(vec,std::back_inserter(halves),[](intx){returnx*0.5;});? 最佳答案 几乎,是的!您只需要使用std::ranges::命名空间而不仅仅是s

c++ - std::list 上的 splice() 和迭代器失效

list::splice()的三参数形式将单个元素从一个列表移动到另一个列表。SGI'sdocumentation明确声明所有迭代器,包括指向被移动元素的迭代器仍然有效。Roguewave'sdocumentation没有说明splice()方法的迭代器失效属性,而C++标准明确指出它会使所有迭代器和对被拼接元素的引用失效。splicing()在实践中按照SGI的定义工作,但我在Microsoft的STL实现(严格遵循标准的字母)的调试/安全SCL版本中遇到断言失败(取消引用无效迭代器)。现在,我使用列表正是因为我想在列表之间移动一个元素,同时保持指向它的迭代器的有效性。该标准对原始S

c++ - std::list::clear 是否使 std::list::end 迭代器无效?

检查这段代码:#include"stdafx.h"#includeint_tmain(intargc,_TCHAR*argv[]){std::listmylist;mylist.push_back(1);std::list::iteratori=mylist.end();if(i==mylist.end())printf("endisend\n");mylist.clear();if(i==mylist.end())printf("nevergetherebecauseMicrosoftseemsto""thinktheiteratorisnolongersafe.\n");retur

c++ - C++ 迭代器的生命周期和有效性是多少?

我计划用C++实现一个事物列表,其中的元素可能会被乱序删除。我不希望我需要任何类型的随机访问(我只需要定期扫描列表),而且项目的顺序也不重要。所以我想到了std::listwiththis->position=insert(lst.end(),thing)应该可以解决问题。我希望Thing类记住每个实例的位置,以便以后可以轻松地执行lst.erase(this->position)在常数时间内。但是,我对C++STL容器还是有点陌生​​,我不知道将迭代器保存这么长时间是否安全。特别是考虑到在插入的Thing消失之前和之后还会有其他元素被删除。 最佳答案

c++ - STL迭代器相等性是如何建立的?

我想知道,STL迭代器的相等性(==)是如何建立的?它是简单的指针比较(因此基于地址)还是更花哨的东西?如果我有来自两个不同列表对象的两个迭代器并比较它们,结果是否总是错误的?如果我将一个有效值与超出范围的值进行比较怎么办?这总是错误的吗? 最佳答案 如果需要,迭代器类可以定义重载的==运算符。所以结果取决于operator==的实现。您真的不应该比较来自不同容器的迭代器。我认为如果您这样做,一些调试STL实现会发出警告信号,这将帮助您在代码中发现这种错误使用情况。 关于c++-STL迭

c++ - 为什么范围的算法与 std 的迭代器不兼容?

#include#include#includeintmain(){autocoll=std::vector{1,2,3};ranges::copy(coll,ranges::ostream_iterator{std::cout,","});//okranges::copy(coll,std::ostream_iterator{std::cout,","});//error}上面的代码显示了这个问题。我用ranges-v3-0.3.7.对我来说,通用算法copy不应该关心目标迭代器类型,只要它满足输出迭代器的要求即可。如果是这样,为什么范围的算法与std的迭代器不兼容?

c++ - unordered_map 中迭代器的效率 (C++)

我似乎找不到这方面的任何信息,所以我求助于stackoverflow。C++中std::tr1::unordered_map的迭代器效率如何?特别是与列表迭代器相比。制作一个包装类是否有意义,该包装类也将所有键保存在列表中以允许高效迭代(我的代码确实对unordered_map中的键使用了大量迭代)。对于那些会推荐boost的人,我不能使用它(无论出于何种原因)。 最佳答案 我没有检查TR1,但N3035(C++0x草案)是这样说的:Allthecategoriesofiteratorsrequireonlythosefunctio

c++ - 我可以检查 C++ 迭代器是否为 null 吗?

我在使用vector迭代器时遇到了问题。我在一些地方读到过,检查空迭代器是不可能的,检查迭代器的常用方法是在搜索后根据vector.end()检查它。例如:vectoranimalList;vector::iteratorfindInList(consttype_info&type){//LoopthroughlistofAnimals,ifDogfound,returniteratortoit}autoit=findInList(typeid(Dog));//WithapointerIcancheckifit'snull,butwithaniteratorIhavetocheckag

c++ - 通过迭代器获取集合元素的 "index"

这个问题在这里已经有了答案:indexorpositioninstd::set(3个答案)关闭5年前。这个问题适用于std::set和std::unsorted_set。我有一个指向集合中元素的迭代器。我想使用迭代器根据元素在集合中的位置获取元素的“索引”。例如,我的集合的索引如下:intindex=0;for(MySetType::iteratorbegin=mySet.begin();begin!=mySet.end();begin++){cout我曾尝试使用迭代器进行算术运算,但它不起作用:intindex=mySetIterator-mySet.begin();有没有办法使用迭

c++ - 将默认构造的迭代器与 operator== 进行比较

C++标准是否说我应该能够比较两个默认构造的STL迭代器是否相等?默认构造的迭代器是否具有相等可比性?我想要以下内容,例如使用std::list:voidfoo(conststd::list::iteratoriter){if(iter==std::list::iterator()){//Something}}std::list::iteratori;foo(i);我在这里想要的是类似于迭代器的NULL值,但我不确定它是否合法。在VisualStudio2008附带的STL实现中,它们在std::list的operator==()中包含断言以排除这种用法。(他们检查每个迭代器是否由同一