C++ 使用map來分析字串 20點
我想練習c++的 map用法
已有一string str1= "a11a1a2" 由數字和英文(假設只有一種例如 a)組成
我想從這個字串中找到所有1和2的位置,並存起來
例如1出現在第 1 2 4個位置 2出現在第6個位置
想用map<int , int>存成
1 1 1 2
1 2 4 6
這樣像pair的形式
而此處str[1] ='1' 要如何轉成整數呢(atoi無法用)
最後再逐一尋訪並印出來
這樣該怎麼下手呢
附上我試做的寫法
for(i = 0;i
:: const_iterator map_it;
map_it = mp.begin();
while (map_it!=mp.end()) {
cout<<"index"< first<<"value"< second<
for(i = 0;i
:: const_iterator map_it;
map_it = mp.begin();
while (map_it!=mp.end()) {
cout<<"index"< first<<"value"< second<
不知道為什麼一直被切掉= =
我主要想問:if(s1[i] == '1' || s1[i] == '2')
mp.insert(make_pair(i ,(s1[i])-'0') );
這樣的寫法OK嗎 覺得有點冗長
另外 map 用insert進去的值好像會依key自動排序
這是真的嗎
另外依我這種不需讀近來就已排序的資料
是否可使用vector 會比較妥當嗎?
因為我要記錄找到1或2的位置
除了用map外
我最後是選用vector > 來做
不過這樣每次加入元素時 還是都要呼叫一個make_pair( )
不知是否會很浪費資源
又掉字= =
我試選用 vector<pait<int,int> >
1 個解答
- TaiLv 58 年前最佳解答
#include <iostream>
#include <string>
#include <map>
using namespace std;
int main(int argc, char* argv[])
{
string str1= "a11a1a2";
map<int, int> m;
int key = 0;
for (string::iterator i= str1.begin(); i != str1.end(); ++i) {
if ((*i) == '1' || (*i) == '2')
m[key++] = (*i)-'0';
}
for (map<int, int>::const_iterator i = m.begin(); i != m.end(); ++i)
cout << i->second << " ";
cout << endl;
}
* map 是按照 key 排序的, 上文 key 是遞增加入, 所以你看不出什麼變化.
2013-01-24 19:11:09 補充:
#include
vector m;
for (string::iterator i= str1.begin(); i != str1.end(); ++i) {
if ((*i) == '1' || (*i) == '2')
m.push_back((*i)-'0');
}
改成這樣就是使用 vector 了. 這也是 STL 漂亮所在, 類似的語法走訪資料.
2013-01-24 20:40:17 補充:
改成 vector 的話
#include
....
vector m;
for (string::iterator i = str1.begin(); i != str1.end(); ++i)
if ((*i) == '1' || (*i) == '2')) m.push_back( (*i)-'0' );
..
2013-01-24 20:49:42 補充:
跟你一樣一直掉字 : (
# i n c l u d e < v e c t o r >
# i n c l u d e < m a p >
這些字都掉了
2013-01-25 19:55:34 補充:
..我最後是選用 < vector > 來做. 不過每次加入元素時 還都要呼叫 make_pair( ) 不知是否會很浪費資源
回 :
資料/位置都要記錄, make_pair 不會浪費資源, 比 tree 結構的 map 還省空間
但你最後目的為何, 如果之後要走遍所有的 1之類的, 不妨練習 multimap