substr()、compare()、string中的find()函数、

来源:互联网 发布:广州易娱网络怎么样 编辑:程序博客网 时间:2024/05/22 01:26

题目名称 : [STL] Delivery (eden)

时间限制 : 1000 ms

空间限制 : 32 MB

Description

快递公司在运送货物的时候,会通过机器扫描得到货物信息。

但由于网络问题或重复扫描等问题,会产生冗余信息。

现在需要根据接收到的信息,进行整理并按时间排序,去除掉多余信息。

信息方式:

YYYY/MM/DD-HH:mm:ss|快递信息

保留某“快递信息”最早记录。

按时间顺序进行排序。

月:1-12

日:1-30

时:0-23

分、秒:0-59

输出格式

YYYY/MM/DD-HH:mm:ss : 快递信息

Hint

  1. map中key为唯一的。
  2. 可能用到的函数: std::map::find和string相关函数:findfirstof、substr、compare等

Sample Input

42016/01/04-12:12:12|out2016/01/04-12:23:43|get2016/01/04-12:12:12|get2016/01/04-12:10:42|out

Sample Output

2016/01/04-12:10:42 : out2016/01/04-12:12:12 : get
代码:

Delivery.hpp:

#include <vector>#include <cstdlib>#include <string>#include <cctype>#include <map>#include <cstring>using namespace std;vector<string> getInfoSort(vector<string> &info){vector<string> result;map<string,string> storage;for(int i = 0; i < info.size(); i++){string str1 = info[i].substr(0,19);string str2 = info[i].substr(20,info[i].size()-1);string str3 = " : ";str3 += str2;map<string,string>::iterator iter;/*bool flag = true;map<string,string>::iterator iter;for(iter = storage.begin(); iter != storage.end(); iter++){if(iter->second == str3){if(str1.compare(iter->first) <= 0) iter->first = str1;//map中key的值是不能改变的} }*/iter = storage.find(str3);if(iter == storage.end()){storage.insert(pair<string,string>(str3,str1));}else{if(str1.compare(iter->second) <= 0) iter->second = str1;}}map<string,string> storage1;map<string,string>::iterator iter;for(iter = storage.begin(); iter != storage.end(); iter++){storage1.insert(pair<string,string>(iter->second,iter->first));}for(iter = storage1.begin(); iter != storage1.end(); iter++){string temp = "";temp = iter->first;temp += iter->second;result.push_back(temp);}return result;}
main.cpp:

#include <iostream>#include <vector>#include <string>#include "Delivery.hpp" using std::string; int main() {    std::vector<string> info;    int n = 0;    std::cin >> n;    for (int i = 0; i < n; i++) {        std::string temp;        std::cin >> temp;        info.push_back(temp);    }      std::vector<string> afterSort = getInfoSort(info);     for (std::vector<string>::iterator it = afterSort.begin();         it != afterSort.end();         ++it) {        std::cout << *it << std::endl;    } system("pause");    return 0;}
知识点一:

str.substr(startpos, length);其中 startpos 是起始字符的序号,length 是[从 startpos 开始]取的字符串长度(包括startpos )。#include<string>#include<iostream>using namespace std;main(){string s("12345asdf");string a=s.substr(0,4);       //获得字符串s中 从第0位开始的长度为4的字符串cout<<a<<endl;}输出结果为:1234
知识点二:

 str1.compare(str2) 当str1大于str2时,返回值为1; 当str1小于str2时,返回值为-1; 当str1等于str2时,返回值为0。  //str1的子串(从索引3开始,包含4个字符)与str2进行比较      if(str1.compare(3,4,str2)==0)    //str1指定子串与str2的指定子串进行比较      if(str1.compare(3,4,str2,3,4)==0)    //str1指定子串与字符串的前n个字符进行比较  知识点二:    if(str1.compare(0,2,"hi,hello",2)==0)  

知识点三:

 str.find(str2) 从str中找str2,找到则返回第一个字符的索引; 没找到则返回 string::npos std::string str ("There are two needles in this haystack with needles.");    std::string str2 ("needle");      // different member versions of find in the same order as above:    std::size_t found = str.find(str2);    if (found!=std::string::npos)      std::cout << "first 'needle' found at: " << found << '\n'; ==>first 'needle' found at: 14 st1.find('a', 2)   在st1中,从位置2(b,包括位置2)开始,查找字符a st2.find("abcdefg", 2, 3)   取abcdefg得前3个字符(abc)参与匹配,相当于st2.find("abc", 2) rfind()是从指定位置起向前查找,直到串首  在源串中从位置pos起往后查找,只要在源串中遇到一个字符,该字符与目标串中任意一个字符相同,就停止查找,返回该字符在源串中的位置;若匹配失败,返回npos。 str1.find_first_of(str2, 0) << endl;//从str1的第0个字符b开始找,b不与str2中的任意字符匹配;再找c,c不与str2中的任意字符匹配;再找g,     //g与str2中的g匹配,于是停止查找,返回g在str1中的位置2  */
知识点四:

map中插入元素是按照key自动升序排列的。