草庐IT

c++ - 删除 std::list::iterator 不会使迭代器无效并销毁对象吗?

为什么下面打印2?listl;l.push_back(1);l.push_back(2);l.push_back(3);list::iteratori=l.begin();i++;l.erase(i);cout我知道erase返回什么,但我想知道为什么这样可以?或者它是未定义的,还是取决于编译器? 最佳答案 是的,这是未定义的行为。您正在取消引用一种野指针。在erase之后,您不应该使用i的值。是的,erasedestructs指向的对象。但是,对于POD类型,销毁不会执行任何操作。erase不会为被删除的迭代器分配任何特殊的“空”

c++ - 使用 std::ifstream、std::istream_iterator 和 std::copy 不读取整个文件

我在一个188字节的文件中使用了以下代码:std::ifstreamis("filename",std::ios::binary);std::vectorbuffer;std::istream_iteratori_input(is);std::copy(i_input,std::istream_iterator(),std::back_inserter(buffer));std::cout但是它只读取了188个字节中的186个字节。我已经在十六进制编辑器和ls-al中确认了文件大小。 最佳答案 我不知道为什么,但默认情况下似乎会跳过

c++ - STL map<char*,char*> 析构函数

我知道映射析构函数调用每个包含元素的析构函数。会发生什么map?我看不到这段代码在/usr/include/c++/4.4中的什么地方编辑:我应该说map喜欢http://www.sgi.com/tech/stl/Map.html 最佳答案 当map被摧毁,它包含的所有元素也被摧毁。如果元素是类类型,则调用每个元素的析构函数。但是,请牢记上面map中包含的内容。正如您所料,它不是字符串——它只是指向字符串的指针。琴弦本身并没有被破坏。只有指针是。delete永远不会在指针上调用。恰当的例子:mapstrings;char*key=n

c++ - 根据索引移除 vector 元素

我想根据索引删除vector的元素,比如所有偶数索引元素。我已经阅读了有关eraseremove习语的内容,但看不到如何应用它。这是我尝试过的:vectorline;line.reserve(10);for(inti=0;i这将删除整个vector。我希望只删除已被删除算法标记的元素。然后我试了一下for(unsignedinti=0;i这再次不起作用,因为在删除时出现问题,索引似乎在迭代vector时移动。实现这一目标的正确方法应该是什么。 最佳答案 从0到size,您最终会跳过一半的元素,因为索引随着您删除元素而改变。让你的fo

C++ 从 map 的第二个元素迭代

我有一个std::multimap,我正在使用前向迭代器对其进行迭代。std::multimap::iteratorit;for(it=map.begin();it!=map.end();++it){//dosomething}现在我需要区别对待第一个元素并从map的第二个元素开始迭代。我该怎么做? 最佳答案 std::multimap::iteratorit;for(it=std::next(map.begin());it!=map.end();++it){//dosomething}这仅适用于C++11。您需要包括.另一个选项很

C++ std::set::erase 与 std::remove_if

此代码有VisualStudioerrorC3892。如果我将std::set更改为std::vector-它有效。std::seta;a.erase(std::remove_if(a.begin(),a.end(),[](intitem){returnitem==10;}),a.end());怎么了?为什么我不能将std::remove_if与std::set一起使用? 最佳答案 您不能使用std::remove_if()具有const的序列部分。std::set的序列元素由Tconst组成对象。事实上,我们昨天在标准C++委员会

c++ - 使用 STL 函数快速填充 vector 、映射和设置

我想用一些数据快速填充这些容器以进行测试。最好和最快的方法是什么?它不应该太复杂,因此短得不人道,但也不要冗长编辑伙计们,我认为你可以用memset做一些事情,知道vector有一个下划线数组?另外,map呢? 最佳答案 boost赋值库方式(http://www.boost.org/doc/libs/1_38_0/libs/assign/doc/index.html)使用命名空间boost::assign;std::vectorv;v+=1,2,3,4,5,6,7,8,9;std::mapm;insert(m)("Bar",1)(

c++ - 在c++中合并8个排序列表,我应该使用哪种算法

我有8个排序列表需要合并到1个排序列表中。我不知道最好的方法。我在想以下几点:voidmerge_lists_inplace(list&l1,constlist&l2){list::iteratorend_it=l1.end();--end_it;copy(l2.begin(),l2.end(),back_inserter(l1));++end_it;inplace_merge(l1.begin(),end_it,l1.end());}listmerge_8_lists(list[8]lists){merge_lists_inplace(lists[0],lists[1]);merge

c++ - 包含任意类型的任意 STL 容器的函数模板

我有一个任意的STL容器C,其中包含任意类型T的元素。我想创建一个std::vector,它具有所有元素的拷贝。最干净的方法是什么?templatevoidmyfunction(Ccontainer){/*DerivethetypeTofelementswithinthecontainer*/std::vectormystack;/*Iterateovercontainerandpush_back()theelementsintomystack*/} 最佳答案 vector和set等STL结构应该包含类型定义为T的value_typ

c++ - 对 STL 集使用比较器

检查以下代码:stringtoLowerCase(conststring&str){stringres(str);inti;for(i=0;ileagues;set::iteratoriter;leagues.insert("BLeague");leagues.insert("aLeague");//leagues={"aLeague","BLeague"}leagues.insert("ALeague");for(iter=leagues.begin();iter!=leagues.end();iter++)cout输出是:aLeagueBLeague这让我很震惊。我认为(并期待)输