1. 程式人生 > >在for迴圈裡對std::map進行元素移除

在for迴圈裡對std::map進行元素移除

#include <iostream>
#include 
<string>
#include 
<map>
#include 
<algorithm>
#include 
<vector>

template
<class TElement>struct stPrintPairContainerElement
    : 
public std::unary_function<TElement, void>
{
    
voidoperator()( const TElement& elem )
    {
        std::cout 
<< elem.first
            
<<" : "<< elem.second 
            
<< std::endl;
    }
};

template
<class TElement>struct stPrintNoPairContainerElement
    : 
public std::unary_function<TElement, void>
{
    
voidoperator()( const TElement& elem ) const
    {
        std::cout 
<<
 elem << std::endl;
    }
};

template
<class TLeft, class TRight>struct stPred
    : 
public std::binary_function<TLeft, TRight, bool>
{
    
booloperator()( const TLeft& left , const TRight& right) const/// 最後這個const不加不行    {
        
return left.second == right;
    }
};

/// for vector, deque 
template <class TContainer, class TElement> 
inline 
void vector_erase(TContainer & container, TElement const& elem) 

    container.erase( std::remove(container.begin(), container.end(), elem), container.end() ); 


template 
<class TContainer, class TPred> 
inline 
void vector_erase_if(TContainer & container, TPred pred) 

    container.erase( std::remove_if(container.begin(), container.end(), pred), container.end() ); 


/// for list, set, map template <class TContainer, class TElement> 
inline
void list_erase(TContainer & container, TElement const& elem) 

    
for (TContainer::iterator it = container.begin(); it != container.end();)
    {
        
if (*it == elem)
        {
            container.erase(it
++);
        }
        
else
        {
            
++it;
        }
    }


template 
<class TContainer, class TPred> 
inline
void list_erase_if(TContainer & container, TPred pred) 

    
for (TContainer::iterator it = container.begin(); it != container.end();)
    {
        
if (pred(*it))
        {
            container.erase(it
++);
        }
        
else
        {
            
++it;
        }
    }


int _tmain(int argc, _TCHAR* argv[])
{
    typedef std::map
<int, std::string> tMap;
    typedef tMap::iterator tMapIterator;

    tMap MyMap;

    std::
string str ="I'm the first!";
    MyMap.insert(tMap::value_type(
0, str));

    str 
="I'm the second!";
    MyMap.insert(tMap::value_type(
1, str));

    std::for_each(MyMap.begin(), MyMap.end(), stPrintPairContainerElement
< std::pair<int, std::string>>());

    list_erase_if( MyMap, std::bind2nd(stPred
< std::pair<int, std::string>, std::string>(), str) );

    std::cout 
<<"After erase: "<< std::endl;
    std::for_each(MyMap.begin(), MyMap.end(), stPrintPairContainerElement
< std::pair<int, std::string>>());

    
/// for vector    typedef std::vector<int> tVector;
    typedef tVector::iterator tVectorIterator;

    tVector MyVec;
    MyVec.push_back(
1);
    MyVec.push_back(
2);
    MyVec.push_back(
3);

    std::cout 
<<"Before erase: "<< std::endl;
    std::for_each(MyVec.begin(), MyVec.end(), stPrintNoPairContainerElement
<int>());

    vector_erase(MyVec, 
1);

    std::cout 
<<"After erase: "<< std::endl;
    std::for_each(MyVec.begin(), MyVec.end(), stPrintNoPairContainerElement
<int>());
    

    
return0;
}

相關推薦

for迴圈std::map進行元素

#include <iostream>#include <string>#include <map>#include <algorithm>#include <vector>template<class TElement>struct s

小猿圈python之一個for迴圈多個列表進行迭代

for迴圈在平時工作中經常會用到,有時候會是好多層迴圈才能達到目的,怎麼多層迴圈才會實現這個功能並保持程式碼的優雅呢?今天小猿圈詳

手動提交事務和在for迴圈進行事務控制及宣告式事務的使用例項!

事務場景:需要做一個跑批進行一個流程的實現,0.獲取異常資料(多條),for迴圈對單條資料進行下面三個操作:1).呼叫別的系統進行查詢,2).查詢自己的庫中資料,3)更改自己資料庫中的資料狀態。此時就需要對單條資料操作的3步驟進行事務控制,使用的過程中發現兩個解決辦法:第一:

C++中用for迴圈多幅影象進行同樣的處理

問題描述: 有n幅圖,命名分別為Image1.tif,Image2.tif ... ... Imagen.tif 現在要在一個for迴圈中對每幅影象進行同樣的處理,如灰度化,二值化等,需要用到函式

thymeleaf 會 js 的字元轉義,包括 for 迴圈的字元,導致報錯。

發現 thymeleaf 檢查 html 語法也就算了,還會對 js 中的字元進行轉移,導致解析 js 報錯,連 js for 迴圈 都要報錯。 這樣的東西,也敢釋出啊?   = = 最後搜來搜去,找到了解決方法:在 js 里加上  /*<![CDATA[*/ 和

for迴圈的的相關索引值/閉包

一個小例子 直接使用for迴圈 for(var i=0; i< 6; i++){ console.log(i); } 列印的結果為:1 2 3 4 5 6 但是結合到某一例項,或者建立相關DOM元素後 <div id="box"> <div>盒子1&

JavaScript使用for迴圈和splice刪除陣列指定元素的注意點

在JavaScript裡可以結合for迴圈和splice來刪除陣列指定的元素。但是要注意刪除元素後,陣列索引會發生改變 示例 var arr = ["a","b","c","a",'a',"b"]; var ele = "a"; for(var

js在for迴圈新增事件後獲取i

1 <ul> 2 <li index="1">1</li> 3 <li index="2">1</li> 4 <li index="3">1</l

innerHTML在for迴圈“只執行一次”的問題(本人小白一枚)

今天在w3school裡系統學習JS的知識時,看到一個TIY,原本程式碼如下:  <!DOCTYPE html> <html> <body> <p>點選下面的按鈕,將程式碼塊迴圈五次:</p> <butto

springboot~configserver重要資訊進行RSA加密

簡介 RSA非對稱加密有著非常強大的安全性,HTTPS的SSL加密就是使用這種方法進行HTTPS請求加密傳輸的。因為RSA演算法會涉及Private Key和Public Key分別用來加密和解密,所以稱為非對稱加密。Private Key和Public Key有互操作性,即用private key加密的可

for迴圈、forEach、map、filter區別及效率分析

        遍歷陣列最常用到的for迴圈,是最為熟知的一種方法,在ES5中定義了一些新的遍歷方法,更加適用於函數語言程式設計,究竟其用法區別在哪,以及效率如何,接著下來親自做個測試看一下。在Script中寫入, var testData = [];//陣列初始

在foreach迴圈list結構進行新增或刪除

在迴圈中對list進行新增或刪除操作,會丟擲currentModifierException,因為在迴圈過程中動態的加入或刪除list元素會導致list的元素數量改變,出現漏項或者無限迴圈等現象。 ·如果要在foreach迴圈中刪除list中的元素,要使用itrator迭代

kotlin 中的 "for" 迴圈和迭代map

文章目錄 ● 場景 ● “for” 迴圈 ● 迭代map ● 總結 場景 kotlin 中的 “for” 迴圈和迭代 map 與我們熟知的 java 中的有什麼區別呢,有哪些更好的表現形式呢? “for” 迴圈

為什麼不建議在for迴圈中使用"+"進行字串拼接

常用的字串拼接方式有五種,分別是使用+、使用concat、使用StringBuilder、使用StringBuffer以及使用StringUtils.join。 用時從短到長的對比:StringBuilder < StringBuffer < concat < + < StringU

Java for迴圈i++位置改變的影響

有下面這樣一段Java程式碼: for (int i = 0; i < 3;i++) { System.out.println(i); if (i == 1) { co

for迴圈套try-catch-finally,執行流程

package com.demo; public class Test { public static void main(String[] args) throws Exception{ String[] members = new Stri

增強for迴圈對於“二維”陣列進行迴圈的案例

對於“二維”陣列進行foreach迴圈的話可以如下: String name[][] = { { "張三", "李四", "王五" }, { "張六", "李七", "王八" }, { "張九

最簡例子講透for迴圈的return、break、continue——尋止

1.測試return List l = new ArrayList(); l.add("0x123"); l.add(false); l.add(0x345); l.add(null); l.add(025); for(int i=0;i&

python學習——讀取染色體長度(七:for循環染色體序列進行反向互補)

導入模塊 int 終端 染色體 文件名 循環 open sys.argv pan 對fasta文件genome_test.fa中的染色體序列進行反向互補,並輸出到文件genome_test_RC.fa genome_test.fa >chr1ATATATATAT&

關於for迴圈的計時器

也算是比較經典的面試題了 for(var i=0;i<5;i++){ console..log(i) }