vector、map 判断某元素是否存在、查找指定元素

一、vector

    1.判断某元素是否存在
        vector<string> vStr;
        
        int nRet = std::count(vStr.begin(), vStr.end(), "xiaochun");//判断vector中是否有 "xiaochun" 这个元素
        
    2.查找某个元素
    
        方法一:

          自己写循环遍历


        方法二:

          vector<string> vec;

          vector<string>::iterator iter;

          string gpcode="SZ000001";

          iter = find(vec.begin(), vec.end(), gpcode);

          if(iter != vec.end())
          {
            //vec中存在"SZ000001"
          }

          else
          {
            //没找到
          }         

        注意:
      
          如果vector中保存的是自定义类型(结构体/类),则需要为该类型重载==操作符。再用find

        #include <stdio.h>
        #include <vector>
        #include <string>
        #include <algorithm>  //是C++的标准模版库(STL)中最重要的头文件之一,提供了大量基于迭代器的非成员模板函数。
		using namespace std;
		
        class DemoStruct
        {
          public:
          string gpcode;
          int ymd;
          vector<int> vec;
          DemoStruct()
          {
            ymd = 20170707;

            gpcode = "";
          }

          bool operator == (const DemoStruct & obj) const //重载 “==” 操作符,函数最后的 const 别忘了,否则会报错。(详见:http://www.cnblogs.com/SZxiaochun/p/7731900.html)
          {
            return ymd == obj.ymd && gpcode == obj.gpcode;  //具体匹配条件,可以自己设定
          }
        };

        int main()
        {  
          vector<DemoStruct> vec_struct;

          DemoStruct demo;
          demo.gpcode = "SZ000001";
          demo.ymd = 20170707;
          demo.vec.push_back(0);
          vec_struct.push_back(demo);

          DemoStruct tmpdemo;
          tmpdemo.gpcode = "SZ000001";
          tmpdemo.ymd = 20170707;

          vector<DemoStruct>::iterator iter;
          iter = find(vec_struct.begin(), vec_struct.end(), tmpdemo);
          if (iter != vec_struct.end())
          {
            printf("%s","find it");
          }
          return 0;
        }
		
		
		注意:
			如果vector中保存的是自定义类型(结构体/类),且不方便重载==操作符,可以用 find_if
			
		struct StockInfo
		{
			short shtSetCode;
			string sCode;
		};
		
		int main()
		{
			vector<StockInfo> vStock;

			StockInfo stockInfo1;
			stockInfo1.shtSetCode = 0;
			stockInfo1.sCode = "000002";
			vStock.push_back(stockInfo1);

			StockInfo stockInfo2;
			stockInfo2.shtSetCode = 0;
			stockInfo2.sCode = "000003";
			vStock.push_back(stockInfo2);

			StockInfo stockInfo3;
			stockInfo3.shtSetCode = 0;
			stockInfo3.sCode = "000004";
			vStock.push_back(stockInfo3);

			//使用 find_if 自定义比较条件
			if (find_if(vStock.begin(), vStock.end(), [&stockInfo1](StockInfo const & obj) {return obj.shtSetCode == stockInfo1.shtSetCode && obj.sCode == stockInfo1.sCode; }) != vStock.end()) //如果编译报错 “‘this’实参时丢弃了类型限定”,就把 & obj 前面的const去掉
			{
				cout << "111" << endl;
			}
			return 0;
		}
		
        //这种场景,还可以使用set
		struct StockCmp //自定义 set 第二个参数
		{
			bool operator()(const StockInfo &lStock, const StockInfo &rStock) const
			{
				if (lStock.iMarket < rStock.iMarket)
				{
					return true;
				}
				else if (lStock.iMarket == rStock.iMarket)
				{
					if (lStock.sCode < rStock.sCode)
					{
						return true;
					}
				}
				return false;
			}
		};
		
		set<StockInfo, StockCmp> m_setTmp;
		StockInfo stStockInfo;
		stStockInfo.iMarket = 0;
		stStockInfo.sCode = "000001";
		m_setTmp.insert(stStockInfo);
		stStockInfo.iMarket = 0;
		stStockInfo.sCode = "000002";
		m_setTmp.insert(stStockInfo);
		if ( (auto iter = m_setTmp.find(stStockInfo)) != m_setTmp.end())
		{
			//找到了
		}
        
二、map

    1.判断某key是否存在
        map<int, string> mapDemo;
        
        int nRet = mapDemo.count(100);//判断mapDemo中是否有 key = 100 的元素
        
    2.查找某个key
        map<int, string>::iterator iter = mapDemo.find(100);
        if (iter != m_Int.end())
        {
            //找到了
        }
        else
        {
            //没找到
        }
    
	注意:
      
        如果map中的 Key 是自定义类型(结构体/类),则需要自定义map第三个参数。再用find
		#include <stdio.h>
		#include <iostream>
        #include <map>
        #include <string>
        #include <algorithm>  //是C++的标准模版库(STL)中最重要的头文件之一,提供了大量基于迭代器的非成员模板函数。
		using namespace std;
		
		struct StockInfo // Key 是自定义类型
		{
			int iMarket;
			string sCode;
			StockInfo():
			iMarket(0)
			{
			}
		};
		
		struct StockCmp //自定义 map 第三个参数
		{
			bool operator()(const StockInfo &lStock, const StockInfo &rStock) const
			{
				if (lStock.iMarket < rStock.iMarket)
				{
					return true;
				}
				else if (lStock.iMarket == rStock.iMarket)
				{
					if (lStock.sCode < rStock.sCode)
					{
						return true;
					}
				}
				return false;
			}
		};
		
		int main()
		{
			map<StockInfo, int, StockCmp> mapTestSort;

			StockInfo stockInfo3;
			stockInfo3.iMarket = 1;
			stockInfo3.sCode = "600000";
			mapTestSort.insert(make_pair(stockInfo3,2));

			StockInfo stockInfo2;
			stockInfo2.iMarket = 0;
			stockInfo2.sCode = "000002";
			mapTestSort.insert(make_pair(stockInfo2,3));

			StockInfo stockInfo1;
			stockInfo1.iMarket = 0;
			stockInfo1.sCode = "000001";
			mapTestSort.insert(make_pair(stockInfo1,1));
			
			cout << mapTestSort[stockInfo1] << endl;
			map<StockInfo, int, StockCmp>::iterator iter = mapTestSort.find(stockInfo1);
			if (iter != mapTestSort.end())
			{
				cout << iter->second << endl;
			}
			
			return 0;
		}
		

  

posted @ 2017-07-07 11:39  那一剑的風情  阅读(68866)  评论(1编辑  收藏  举报