草庐IT

Iterator

全部标签

c++ - 如果我使用 vector::begin() 而不是 std::back_inserter(vector) 作为 set_intersection 的输出会怎样?

我一直在使用高度简洁和直观的C​​++语法来查找两个排序的vector的交集并将结果放入第三个vector:vectora,b,c;//...std::set_intersection(a.begin(),a.end(),b.begin(),b.end(),std::back_inserter(c));这应该将c设置为intersection(a,b),假设a和b已排序。但是如果我只使用c.begin()会怎么样(我想我在某个地方看到了一个例子,这就是我这样做的原因):std::set_intersection(a.begin(),a.end(),b.begin(),b.end(),c

c++ - 使用索引与迭代器将 vector 迭代到倒数第二个元素

当从C++11std::vector的开头迭代到倒数第二个元素时,首选样式是什么?std::vectorargv;std::stringstr;是否应该使用这种更像C++的方法for(constauto&s:decltype(argv)(argv.begin(),argv.end()-1)){str+=std::string(s)+'';}还是应该首选更传统的方式?for(size_ti=0;i 最佳答案 请不要这样写:for(constauto&s:decltype(argv)(argv.begin(),argv.end()-1)

c++ - 如何以线程安全的方式遍历容器?

我有一个容器(C++),我需要从不同线程以两种方式对其进行操作:1)添加和删除元素,以及2)遍历其成员。显然,在迭代发生时删除元素=灾难。代码看起来像这样:classA{public:...voidAddItem(constT&item,intindex){/*Putitemintomy_stuffatindex*/}voidRemoveItem(constT&item){/*Takeitemoutofm_stuff*/}constlist&MyStuff(){returnmy_stuff;}//*Hate*this,butseeclassCprivate:Mutexmutex;//G

c++ - 比较迭代器,C++

是否可以比较两个迭代器?使用std::min的比较voidchange(typenameTList::Type::iteratorit_begin,typenameTList::Type::iteratorit_end){....this->items.resize(index);std::sort(it_begin,std::min(it_end,it_begin+=index-1);//Comparetwoiterators,exception....}抛出以下异常:Assertionfailed:Vectoriteratorsincompatible...还有其他比较方式吗?

c++ - 常量映射迭代器不会设置为 mymap.begin()

map::iteratorit=mymap.begin();迭代器似乎是常量,但items.begin()不返回常量迭代器。或者,这就是我的想法,因为鼠标悬停错误类似于:"Noconversionfrom'std::Tree_const_iteratortostd::Tree_iteratorexists'".为什么? 最佳答案 将const_iterator用作:map::const_iteratorit=mymap.begin();从错误来看,很明显mymap.begin()返回const_iterator。这是因为mymap在

c++ std::map 关于迭代器顺序的问题

我是一名C++新手,正在尝试使用map,以便我可以不断地查找find()方法。问题是,当我使用迭代器遍历map中的元素时,元素出现的顺序与它们在map中的放置顺序不同。有没有办法在不维护另一种数据结构的情况下实现有序迭代,同时还保留恒时查找的能力?请告诉我。谢谢,jbu编辑:感谢您让我知道map::find()不是常数时间。 最佳答案 有没有办法在不维护另一种数据结构的情况下,实现有序迭代,同时还保留恒时查找的能力?不,那是不可能的。为了获得高效的查找,容器需要以一种使高效查找成为可能的方式对内容进行排序。对于std::map,这将

for 循环陷阱中的 C++ 迭代器?

我看到它提到的地方:for(itr=files.begin();itr为什么第一个表达式是错误的?我一直使用第一个表达式,没有任何问题。 最佳答案 排序比较如,>,,>=将适用于随机访问迭代器,但许多其他迭代器(例如链表上的双向迭代器)仅支持相等性测试(==和!=)。通过使用!=您稍后可以替换容器而无需更改那么多代码,这对于需要处理许多不同容器类型的模板代码尤其重要。 关于for循环陷阱中的C++迭代器?,我们在StackOverflow上找到一个类似的问题:

c++ - 流缓冲区之间的 block 级数据复制

我想在std::streambuf之间高效复制数据实例。也就是说,我想在它们之间铲出数据block,而不是逐个字符地进行复制。例如,这不是我要找的:stringbufin{ios_base::in};stringbufout{ios_base::out};copy(istreambuf_iterator{in},istreambuf_iterator{},ostreambuf_iterator{out});这里有语法糖,还有更多的错误检查:ostreamos{&out};os这是operator*)的一个实现片段在我的标准库中(MacOSX,XCode7):typedefistream

c++ - 为 boost 的变换迭代器寻找复合特征模式

设置当你想让迭代器在返回之前处理它们正在迭代的内容时,boost::transform_iterator都不错。您向它们传递一个一元函数,该函数转换底层迭代器的operator*()的结果。然后转换迭代器返回:templatestructiterator_transform_traits_map_second{typedeftypenameMap::value_typevalue_type;typedeftypenameMap::mapped_typeresult_type;result_type&operator()(value_type&v)const{returnv.second

c++ - constexpr end istream (sentinel) 迭代器有什么意义?

N2976建议添加constexpr到标准库中的某些位置。它指出iostreams不适合constexpr除了结束迭代器。所以istream_iterator和istreambuf_iterator给出了constexpr默认构造函数,仅此而已。例如,您可以在libstdc++implementation中看到那constexpr在整个文件中只出现一次。引发此更改的LWG是#1129.它说:istream_iteratorandistreambuf_iteratorshouldsupportliteralsentinelvalues.Thedefaultconstructorisfre