Bitcoin Forum
May 29, 2024, 08:56:52 PM *
News: Latest Bitcoin Core release: 27.0 [Torrent]
 
   Home   Help Search Login Register More  
Pages: [1]
  Print  
Author Topic: [РЕШЕНО]boost::bimap insert цикле  (Read 2335 times)
info_infoman (OP)
Sr. Member
****
Offline Offline

Activity: 460
Merit: 250



View Profile
November 06, 2014, 08:22:34 AM
Last edit: November 11, 2014, 04:49:12 PM by info_infoman
 #1

Подскажите
имею конструкцию
typedef boost::bimap<std::string,int> tx_map;
tx_map tm;

while{....

tm.insert( tx_map::value_type(tx_id, nHeight) );

....}

задача добавлять
новые записи в мапу
причем
tx_id должен быть уникальным а вот nHeight может быть каким угодно

в той конструкции что у меня, при добавлении записей в цикле уникальным автоматически стает nHeight
предположу что это из-за того что он int
а хотелось бы наоборот

читал в манах про iterator  который можно в качестве индекса использовать чтоб nHeight индексом не становился

update:
блин посмотрел ман повнимательнее
Code:
bm.clear();

bm.insert( bm_type::value_type( 1, "one" ) );

bm.insert( bm_type::value_type( 1, "1"   ) ); // [b]No effect![/b]
bm.insert( bm_type::value_type( 2, "one" ) ); //[b] No effect![/b]

assert( bm.size() == 1 );

как же быть?  Sad делать выкрутасы с вложенными векторами ох как неохота...

Sheogorath
Newbie
*
Offline Offline

Activity: 41
Merit: 0


View Profile
November 06, 2014, 04:16:16 PM
 #2

typedef boost::bimap<std::string,int> tx_map;
tx_map tm;

while{....

tm.insert( tx_map::value_type(tx_id, nHeight) );

....}

задача добавлять
новые записи в мапу
причем
tx_id должен быть уникальным а вот nHeight может быть каким угодно
Зачем bimap? Туда - std::map, обратно - std::multimap.
info_infoman (OP)
Sr. Member
****
Offline Offline

Activity: 460
Merit: 250



View Profile
November 07, 2014, 11:48:25 AM
 #3

Зачем bimap? Туда - std::map, обратно - std::multimap.
спасибо  действительно std::multimap
это может

info_infoman (OP)
Sr. Member
****
Offline Offline

Activity: 460
Merit: 250



View Profile
November 10, 2014, 12:34:57 PM
 #4

столкнулся с еще одной проблемой

обьявляю мапу

после чего идет цикл while внутри него идет :
если мапа не пустая то принтФ содержимое мапы
далее идет добавление элемента в мапу

но это не работает...

если добавлять в мапу до принтФ то отоборажается иначе пусто

как будто в цикле данные в мапу не добавляются....
а мне очень надо именно в цикле Undecided

info_infoman (OP)
Sr. Member
****
Offline Offline

Activity: 460
Merit: 250



View Profile
November 11, 2014, 07:53:33 AM
 #5

вот такой код не работает:
Code:
std::multimap<std::string,int> mymultimap;
std::multimap<std::string,int>::iterator it;
while{
......
       if(mymultimap.size()>0){
       it = mymultimap.find(tx_id.c_str());
       printf("!!!!!!!!! %s!!!!!!!!!! %i \n",it->first.c_str() , it->second);
       }

......
mymultimap.insert ( std::pair<std::string,int>(tx_id.c_str(),nBestHeight) );
cntinue();
......
}

однако если ставлю
Code:
std::multimap<std::string,int> mymultimap;
std::multimap<std::string,int>::iterator it;
while{
......
       mymultimap.insert ( std::pair<std::string,int>(tx_id.c_str(),nBestHeight) );
       if(mymultimap.size()>0){
       it = mymultimap.find(tx_id.c_str());
       printf("!!!!!!!!! %s!!!!!!!!!! %i \n",it->first.c_str() , it->second);
       }

......

cntinue();
......
}

то все ок

но мне нужно инсертить именно после проверки наличия пары в мапе

поможите плз Huh

awoland
Legendary
*
Offline Offline

Activity: 1498
Merit: 1021

Was mich nicht umbringt macht mich stärker [F.N.]


View Profile WWW
November 11, 2014, 09:08:47 AM
 #6

В плюсах использование printf не есть ТруЪ. Существуют такие механизмы, как cout.

Was mich nicht umbringt macht mich stärker [F.N.]
fsb4000
Legendary
*
Offline Offline

Activity: 1400
Merit: 1000



View Profile
November 11, 2014, 09:22:43 AM
 #7

вот такой код не работает:
Code:
std::multimap<std::string,int> mymultimap;
std::multimap<std::string,int>::iterator it;
while{
......
       if(mymultimap.size()>0){
       it = mymultimap.find(tx_id.c_str());
       printf("!!!!!!!!! %s!!!!!!!!!! %i \n",it->first.c_str() , it->second);
       }

......
mymultimap.insert ( std::pair<std::string,int>(tx_id.c_str(),nBestHeight) );
cntinue();
......
}
но мне нужно инсертить именно после проверки наличия пары в мапе

поможите плз Huh

Да вроде должен работать....
Вот тестик сделал, заработал...
info_infoman (OP)
Sr. Member
****
Offline Offline

Activity: 460
Merit: 250



View Profile
November 11, 2014, 09:46:11 AM
 #8

В плюсах использование printf не есть ТруЪ. Существуют такие механизмы, как cout.
cout не помогает
результат тот же
при попытке использовать it->first программа выпадает в осадок
добавление или убирание c_str() не влияет на результат....

причем  если insert делать до find то все красиво выводится
но мне нужно именно после

такое очучение что во время перехода на новую итерацию цикла
в мапе что то ломается и программа не может отобразить что внутри

fsb4000
Legendary
*
Offline Offline

Activity: 1400
Merit: 1000



View Profile
November 11, 2014, 09:47:03 AM
 #9

В плюсах использование printf не есть ТруЪ. Существуют такие механизмы, как cout.
cout не помогает
результат тот же
при попытке использовать it->first программа выпадает в осадок
добавление или убирание c_str() не влияет на результат....

причем  если insert делать до find то все красиво выводится
но мне нужно именно после

такое очучение что во время перехода на новую итерацию цикла
в мапе что то ломается и программа не может отобразить что внутри
а отладчик что говорит, чтобы не гадать ломается что-то в цикле или нет?
info_infoman (OP)
Sr. Member
****
Offline Offline

Activity: 460
Merit: 250



View Profile
November 11, 2014, 11:08:55 AM
 #10

а отладчик что говорит, чтобы не гадать ломается что-то в цикле или нет?
нет отладчика  Grin
пересобираю по вот этой инструкции https://bitcointalk.org/index.php?topic=149479.0 сразу форк

если писать в четкости как вы описали в тесте то компилятор выдает ошибку

src\main.cpp:4530:31: error: invalid user-defined conversion from 'long long uns
igned int' to 'const key_type& {aka const std::basic_string<char>&}' [-fpermissi
ve]
     it = mymultimap.find(tx_id);
                               ^

info_infoman (OP)
Sr. Member
****
Offline Offline

Activity: 460
Merit: 250



View Profile
November 11, 2014, 12:27:50 PM
 #11

пробую вот такую конструкцию:
Code:
while(.....){
                               bool found = false;
//std::string key = tx_id;
it = mmaapp.find(tx_id);
while(it != mmaapp.end()) {
if (strcmp(it->first, tx_id)){
printf("not found \n");
break;
}else{
found = true;
printf("ok tx_td \n");
break;
}
++it;
}
if(found) {
printf("!!!!!!!!! %s!!!!!!!!!! %i \n",it->first.c_str() , it->second);
}
тут инсерт
}

info_infoman (OP)
Sr. Member
****
Offline Offline

Activity: 460
Merit: 250



View Profile
November 11, 2014, 04:47:56 PM
 #12

заработало! спасибо ребятам с киберфорума!
вот лог:
вот собственно лог:
первая итерация внешнего цикла
2014-11-11 17:14:10 keypool reserve 3
2014-11-11 17:14:10 !!!!!!!! 0
2014-11-11 17:14:10 keypool reserve 4
2014-11-11 17:14:10 !!!!!!!! 1
а на второй появились данные
2014-11-11 17:14:11 !!!!!!!! 2
2014-11-11 17:14:11 @@@@@@@@1
2014-11-11 17:14:11 !!!!@@!!!!!
2014-11-11 17:14:11 !!!!!!!!! 818ed31e955eedc696d726d67c99d2acba7a2070c8993f9dcb9cf5e80e3258c8!!!!!!!!!! 792889
2014-11-11 17:14:11 !!!!!!!! 3
2014-11-11 17:14:11 @@@@@@@@1
2014-11-11 17:14:11 !!!!@@!!!!!
2014-11-11 17:14:11 !!!!!!!!! 9e863ba6b1fb4c5f8b816b9d3d44438e0ed48438f297cb2308897b7dc5b6f8ae!!!!!!!!!! 792889

а вот код:
Code:
bool found = false;
printf("!!!!!!!! %i \n",mmaapp.size());
it = mmaapp.find(tx_id.c_str());
while(it != mmaapp.end()) {
printf("@@@@@@@@1 \n");
if (strcmp(it->first.c_str(), tx_id.c_str())){
printf("!!!!@!!!!! \n");
break;
}else{
found = true;
printf("!!!!@@!!!!! \n");
break;
}
++it;
printf("@@@@@@@@ \n");
}
if(found) {
printf("!!!!!!!!! %s!!!!!!!!!! %i \n",it->first.c_str() , it->second);
}

Pages: [1]
  Print  
 
Jump to:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.19 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!