将C ++ Map复制到键和值向量中

时间:2012-03-28 13:31:08

标签: c++ vector map

我有一个map,我希望第一列i.e (*it).first被推回到一个向量中,然后(*it)->second被推回到另一个向量中

这是最好的方法吗?

std::vector<std::string>test;
for ( it=mymap.begin() ; it != mymap.end(); it++ )
{
    test.push_back((*it).first);
}

我的另一个问题是我是否有一个循环,即 如何将所有整数i插入(*it).first

for(int i = 0; i < 10; i++)
{
    // 1 - 10 will go in (*it).first
}

我希望在(*it).first中包含一些整数,并在(*it).second;

中包含相关值

8 个答案:

答案 0 :(得分:5)

使用std::transform

首先定义两个函数keyvalue,它们取这对字符串并分别返回第一个或第二个值。

#include <map>
#include <vector>
#include <algorithm>
#include <iostream>
#include <iterator>

const std::string& key(const std::pair<std::string, std::string>& keyValue)
{
    return keyValue.first;
}

const std::string& value(const std::pair<std::string, std::string>& keyValue)
{
    return keyValue.second;
}

然后使用std::transform中的<algorithm>功能将地图转换为vector个键或vector个值。

int main()
{
    using namespace std; // be explicit normally, trying to be brief here

    map<string, string> contacts;

    contacts["alice"] = "555-2701";
    contacts["bob"] = "555-2702";

    vector<string> keys(contacts.size());
    vector<string> values(contacts.size());

    transform(contacts.begin(), contacts.end(), keys.begin(), key);
    transform(contacts.begin(), contacts.end(), values.begin(), value);

    cout << "Keys:\n";
    copy(keys.begin(), keys.end(), ostream_iterator<string>(cout, "\n"));

    cout << "\n";

    cout << "Values:\n";
    copy(values.begin(), values.end(), ostream_iterator<string>(cout, "\n"));

    return 0;
}

输出:

Keys:
alice
bob

Values:
555-2701
555-2702

答案 1 :(得分:2)

你的第一个问题,“如何将我的地图的第一列推入一个向量,将第二列推入另一个”,这样就解决了:

std::map<std::string, std::string> mymap;
std::vector<std::string> keys;
std::vector<std::string> values;
for ( std::map<std::string,std::string>::iterator it=mymap.begin() ; it != mymap.end(); ++it )
{
  keys.push_back(it->first);
  values.push_back(it->second);
}

您的第二个问题,“如何将所有整数i插入(*it).first?”这样解决了:

std::map<int, int> mymap2;
for(int i = 0; i < 10; i++)
{
  // Insert default value into map
  // This sets '(*it).first' to 'i' and
  // '(*it).second' to a default value (in
  // this case, 0).
  mymap2[i];
}

std::map<int, int> mymap3;
for(int i = 0; i < 10; i++)
{
  // Insert specified value into map
  // this sets '(*it).first' to 'i', and
  // '(*it).second' to the value returned from the function.
  maymap3[i] = ChooseSpecificValue(i);
}

答案 2 :(得分:2)

嗯,可以通过一个简单的循环完成:

for (auto const& p: mymap) {
  vec1.push_back(p.first);
  vec2.push_back(p.second);
}

或者使用std::transform算法,虽然它在这里非常详细:

std::transform(mymap.begin(), mymap.end(), std::back_inserter(vec1),
               [](MyMap::const_reference p) { return p.first; });

答案 3 :(得分:1)

假设您已将地图声明为字符串键和值(即map<string, string> mymap;,那么它将如下所示,同时假设您已将'it'变量声明为map<string, string>::iterator it等等:

std::vector<std::string> test;
std::vector<std::string> second;
std::map<string, string>::iterator it;

for ( it=mymap.begin() ; it != mymap.end(); it++ )
{
    test.push_back((*it).first);
    second.push_back((*it).second);
}

不确定你的下一个问题。

答案 4 :(得分:0)

  

我的另一个问题是,如果我有一个循环,即如何插入所有   整数我进入(*它).first?

std::map的情况下,您无法修改返回的迭代器...... std::map键/值对数据结构中的关键成员(即第一个)有意地将其指定为常量值,并在std::map数据结构中的键/值对的生命周期的开始处初始化为其常量值。如果密钥不是常量,则在更改密钥时最终会造成破坏,因为假设std::map中的节点按键排序。键/值对数据结构的第二个成员是可以更改的成员。

因此,如果您想在地图中插入一组键/值对,则可以执行以下操作:

std::map<int, int> mymap;
int some_other_value = 100;

for (int i=0; i < 10; i++)
{
    mymap[i] = some_other_value++;
}

答案 5 :(得分:0)

问题的第一部分:

std::vector<std::string> test;
std::vector<std::string> test2; // assuming map is from string to string
for (it = mymap.begin(); it != mymap.end(); ++it)
{
   test.push_back(it->first);     // push first in one vector
   test2.push_back(it->second);   // push second in another vector
}

所以,是的,一个简单的可以做你想要的。


问题的第二部分:

由于您要更新地图的键,因此需要将其从地图中删除并插入更改的地图。所以:

std::string first, second;
first = it->first;
second = it->second;
mymap.erase(it);        // be careful with invalidating iterator
// change first
mymap[first] = second;

要通过向其添加所有整数first来更改i,这实际上取决于first的类型。例如,使用字符串,可能表示类似这样的内容:

ostringstream sout;
for (int i = 0; i < 10; ++i)
    sout << (i?" ":"") << i;
first = sout.str();

或者如果首先是例如set,则可能表示类似这样的内容:

for (int i = 0; i < 10; ++i)
    first.insert(i);

答案 6 :(得分:0)

它将是一个迭代器,它将指向map中的一个位置,并且max最多只有一个迭代器的第一个和第二个值。在最大值,您可以使用多个键或相同的键,保持相同/不同的值,具体取决于键/值组合。

就推动地图中某个键的向量中的值而言,您可以按照与按键相同的方式进行操作

     std::vector<std::string>test;

      std::vector<std::string>test2; 

      for ( it=mymap.begin() ; it != mymap.end(); it++ )


     {

       test.push_back((*it).first); 

      test2.push_back((*it).second);


     }

Neways你的问题很不清楚。

答案 7 :(得分:0)

如果你想在地图中处理不同的数据类型,我会模拟一个通用的复制函数:

template <class A, class B>
void mycopy(std::map<A, B>&m, std::list<A>& keys, std::list<B>& values) {
    typename std::map<A, B>::iterator it;
    for (it = m.begin(); it != m.end(); ++it) {
        keys.push_back( (*it).first );
        values.push_back( (*it).second );   
    }

}

混合起来:

std::map<int, std::string> mymap;
std::list<int> keys;
std::list<std::string> values;

mymap[1] = "string1";
mymap[2] = "string2";

mycopy(mymap, keys, values);


std::map<std::string, int> mymap1;
std::list<std::string> keys1;
std::list<int> values1;

mymap1["string1"] = 1;
mymap1["string2"] = 2;

mycopy(mymap1, keys1, values1);

编辑:是__copy不是最佳定义。感谢