草庐IT

C++迭代器(iterator)

全部标签

c++ - 用于自追加的字符串反向迭代器的持久性

问题:假设我有一个字符串,我想生成一个新字符串,其中包含原始字符串及其反向连接。以下是否保证有效?autopq=[](std::string&s){s.reserve(2*s.size());s.append(s.rbegin(),s.rend());};我看到了reserve应该设置capacity适本地。但是,是否应用append反对反向迭代器会导致这些迭代器失效?其他背景:我的C++.11拷贝(与C++.17draft具有相同的语言),在§[string.capacity]中说voidreserve(size_typeres_arg=0);Thememberfunctionres

c++ - std::map::const_iterator 泄露了对值的非常量引用?

我观察到std::map::const_iterator泄漏了对value_type的非常量引用:#include#includeintmain(intargc,char*argv[]){std::mapfoo={{1,1},{4,2}};constauto&m=foo;constauto&it=foo.find(1);printf("%d%d\n",it->first,it->second);int&i=it->second;i=3;auto&one=foo.at(1);printf("%d%d\n",1,one);return0;}输出$g++test.cc&&./a.out111

c++ - 通过 C++ 中的迭代器从 vector 中获取相邻的元素对

我想遍历vector中的所有相邻对元素。例如,如果我有一个vector{1,2,3,4},我希望我的迭代器返回以下内容:(1,2)(2,3)(3,4)我知道如何使用以下方法一次迭代一个元素:vectornumbers=={1,2,3,4};for(vector::const_iteratorit=numbers.cbegin();words!=numbers.cend();++it){cout但我也不知道如何获取下一个元素。 最佳答案 Vector的迭代器是randomaccessiterator.您可以在迭代器上使用operato

c++ - 在列表迭代期间删除元素 - 安全

我想知道这样的东西是否安全......//Iteratingthroughawhile(iter!=seq.end()){if(test){iter=seq.erase(iter);}else{++iter;}我知道以这种方式遍历vector会使迭代器失效,但同样的事情会发生在列表中吗?我假设不是,因为列表是通过指针顺序排列的,而不是在内存中彼此“相邻”,但任何保证都会有所帮助。 最佳答案 这很好,因为删除方法返回一个新的有效迭代器。 关于c++-在列表迭代期间删除元素-安全,我们在St

c++ - 具有派生类的自定义容器的迭代器

我有一个自定义容器,它以两种不同的方式实现,但只有一个界面。像这样的事情。classVector{virtualIteratorbegin()=0;virtualIteratorend()=0;...//somemorefunctions.};classVectorImplA:publicVector{Iteratorbegin(){returnm_data.begin();}Iteratorend(){returnm_data.end();}private:SomeFloatContainerm_data;};classVectorImplB:publicVector{Iterato

c++ - 哪个是迭代字符串排列的最佳数据结构?

比方说,我们有字符串“ABCAD”,现在我们需要在顺时针和逆时针方向上遍历该字符串的所有可能排列。我丑陋的实现看起来像这样:strings="ABCAD";stringt="";for(inti=0;i输出:阿绍HSAUA苏亚奥哈斯美国哈萨克斯坦大学美国航空安全协会阿修绍阿豪斯AUASH我知道这太天真了,AFAIK循环列表会是更好的选择,有人可以使用STL更有效地实现同样的事情吗? 最佳答案 在伪代码中,我会走这条路:functionrearrange(strings){stringt=s+s;for(inti=0;i可能有一种使用

c++ - 将 "dumb"函数重构为具有容器迭代器的通用 STL 样式

我已经设法了解了C++的一些功能(for_each、映射函数、使用迭代器...),但是用于接收通用容器和迭代器的模板和函数参数列表的构造仍然让我难以理解。我有一个实际的例子,希望有人能为我说明:采用以下函数处理传入的std::vector并构建进程的许多数据点/迭代的运行总和:/*thefor-loopmethod-notverysavvy*/voidUpdateRunningTotal(int_vec&total,int_vec&data_point){for(inti=0;i;int_vecrunning_total(V_SIZE,0);//createacontainertoho

c++ - boost::variant 的迭代器

你好,我正在尝试调整现有代码以适应boost::variant。这个想法是将boost::variant用于异构vector。问题是其余代码使用迭代器访问vector的元素。有没有办法将boost::variant与迭代器一起使用?我试过了typedefboost::variantVariant;std::vectorbag;std::vector::iteratorit;for(it=bag.begin();it!=bag.end();++it){cout但是没有用。编辑:感谢您的帮助!但在我的设计中,我需要从列表中获取一个元素并将它传递给代码的其他部分(这可能很麻烦,因为我使用的是

c++ - 如果容器元素是指针,为什么允许我从 const_iterator 调用非 const 成员函数?

考虑以下代码:#includeusingnamespacestd;structfoo{voidbar(){}};intmain(){{vectora;a.push_back(newfoo());a.push_back(newfoo());a.push_back(newfoo());vector::const_iteratoritr=a.begin();(*itr)->bar();//compiles-thisbecomesmoreconfusing//whenfoundinaconstmethod.Onfirst//glance,onewill(oratleastme)may//ass

c++ - 是否可以测试两个迭代器是否指向同一个对象?

假设我正在创建一个复制值的函数:templatevoidcopy(ItInputi,ItOutputo){*o=*i;}如果i和o指向同一个对象,我想避免赋值,因为这样赋值就没有意义了。显然,我不能说if(i!=o){...},因为i和o可能是不同的类型,因为它们可能指向不同的容器(因此是无可比拟的)。不太明显的是,我也不能使用重载函数模板,因为迭代器可能属于不同的容器,即使它们具有相同的类型。我最初的解决方案是:templatevoidcopy(ItInputi,ItOutputo){if(&*o!=static_cast(&*i))*o=*i;}但我不确定这是否有效。如果*o或*i