2

std::map 構造について質問があります。このコード フラグメントは正しく動作します。

map<string,int> mappa;
int main(int argc, char** argv) {
mappa["b"]=1;
mappa["a"]=2;
 for(std::map<string,int>::iterator it=mappa.begin();it!=mappa.end();++it )
{
    cout<<it->first<<"\n";     
} 
return 0;
}

出力:

a
b

しかし、もしそうなら:

map<string,int> mappa; 
std::map<string,int> getList(){
return mappa;
}

int main(int argc, char** argv) {
mappa["b"]=1;
mappa["a"]=2;
for(std::map<string,int>::iterator it=getList().begin();it!=getList().end();++it )
 {
    cout<<it->first<<"\n";   
 } 
return 0;
}

私の出力はただ

b

なぜ?ありがとう!

4

3 に答える 3

4

for ループでは、getList() が参照ではなく値で返されるため、begin() と end() を mappa の 2 つの別々のコピーから取得しています。参照によって返されるように getList() 関数を変更する必要があります。

期待どおりに動作するコード:

#include <iostream>
#include <string>
#include <map>

using namespace std;

map<string,int> mappa; 

std::map<string,int>& getList() { // returning reference now
  return mappa;
}

int main(int argc, char** argv) {
  mappa["b"]=1;
  mappa["a"]=2;
  for(std::map<string,int>::iterator it=getList().begin();it!=getList().end();++it )
  {
    cout<<it->first<<"\n";   
  } 
  return 0;
}
于 2013-01-13T03:26:12.173 に答える
1

あなたはgetList何度も電話をかけています。コピー コンストラクターを使用して新しいマップを作成するたびに。

あなたはこれをします:

std::map<string,int> myList = getList();
const std::map<string,int>::iterator myListEnd = myList.end();
for(std::map<string,int>::iterator myList.begin();it!=myListEnd;++it )
{

コピーが必要だと思います。

于 2013-01-13T03:28:23.737 に答える
1

getList() は mappa のコピーを返します。参照を返すように変更する必要があります。

std::map<string,int>& getList()

またはさらに良い const 参照:

const std::map<string,int>& getList()

後者の場合、const_iterator を使用してマップを反復処理する必要があります。

于 2013-01-13T03:28:54.447 に答える