如何在c++中将值从矢量转换为映射
How do I convert values from a vector to a map in c++?
我想做这样的事情。有没有一种stl算法可以轻松做到这一点?
for each(auto aValue in aVector)
{
aMap[aValue] = 1;
}
如果您有一个对的向量,其中对中的第一项将是映射的键,第二项将是与该键关联的值,您可以使用插入迭代器将数据复制到映射:
std::vector<std::pair<std::string, int> > values {
{"Jerry", 1},
{ "Jim", 2},
{ "Bill", 3} };
std::map<std::string, int> mapped_values;
std::copy(values.begin(), values.end(),
std::inserter(mapped_values, mapped_values.begin()));
或者,您可以从矢量初始化地图:
std::map<std::string, int> m2((values.begin()), values.end());
可能是这样的:
std::vector<T> v; // populate this
std::map<T, int> m;
for (auto const & x : v) { m[x] = 1; }
您可以将std::transform
和std::vector
std::map
std::vector<std::string> v{"I", "want", "to", "do", "something", "like", "this"};
std::map<std::string, int> m;
std::transform(v.begin(), v.end(), std::inserter(m, m.end()),
[](const std::string &s) { return std::make_pair(s, 1); });
这将从矢量的元素中创建std::pair
s,然后将这些元素插入到映射中。
或者,正如@BenFulton所建议的,将两个矢量压缩到一个地图中
std::vector<std::string> k{"I", "want", "to", "do", "something", "like", "this"};
std::vector<int> v{1, 2, 3, 4, 5, 6, 7};
std::map<std::string, int> m;
auto zip = [](const std::string &s, int i) { return std::make_pair(s, i); };
std::transform(k.begin(), k.end(), v.begin(), std::inserter(m, m.end()), zip);
假设向量中的项目按顺序相关,也许这个例子会有所帮助:
#include <map>
#include <vector>
#include <string>
#include <iostream>
std::map<std::string, std::string> convert_to_map(const std::vector<std::string>& vec)
{
std::map<std::string, std::string> mp;
std::pair<std::string, std::string> par;
for(unsigned int i=0; i<vec.size(); i++)
{
if(i == 0 || i%2 == 0)
{
par.first = vec.at(i);
par.second = std::string();
if(i == (vec.size()-1))
{
mp.insert(par);
}
}
else
{
par.second = vec.at(i);
mp.insert(par);
}
}
return mp;
}
int main(int argc, char** argv)
{
std::vector<std::string> vec;
vec.push_back("customer_id");
vec.push_back("1");
vec.push_back("shop_id");
vec.push_back("2");
vec.push_back("state_id");
vec.push_back("3");
vec.push_back("city_id");
// convert vector to map
std::map<std::string, std::string> mp = convert_to_map(vec);
// print content:
for (auto it = mp.cbegin(); it != mp.cend(); ++it)
std::cout << " [" << (*it).first << ':' << (*it).second << ']';
std::cout << std::endl;
return 0;
}
由于您没有指定任何类型,因此可以按照以下方式完成一种非常通用的方法:
template<class Iterator, class KeySelectorFunc,
class Value = std::decay_t<decltype(*std::declval<Iterator>())>,
class Key = std::decay_t<decltype(std::declval<KeySelectorFunc>()(std::declval<Value>()))>>
std::map<Key, Value> toMap(Iterator begin, Iterator end, KeySelectorFunc selector) {
std::map<Key, Value> map;
std::transform(begin, end, std::inserter(map, map.end()), [selector](const Value& value) mutable {
return std::make_pair(selector(value), value);
});
return map;
}
用法:
struct TestStruct {
int id;
std::string s;
};
std::vector<TestStruct> testStruct = {
TestStruct{1, "Hello"},
TestStruct{2, "Hello"},
TestStruct{3, "Hello"}
};
std::map<int, TestStruct> map = toMap(testStruct.begin(), testStruct.end(),
[](const TestStruct& t) {
return t.id;
}
);
for (const auto& pair : map) {
std::cout << pair.first << ' ' << pair.second.id << ' ' << pair.second.s << 'n';
}
// yields:
// 1 1 Hello
// 2 2 Hello
// 3 3 Hello
参数selector
函数用于选择std::map
中的密钥使用的内容。
试试这个:
for (auto it = vector.begin(); it != vector.end(); it++) {
aMap[aLabel] = it;
//Change aLabel here if you need to
//Or you could aMap[it] = 1 depending on what you really want.
}
我想这就是你想要做的。
如果要更新aLabel
的值,可以在循环中对其进行更改。此外,我回顾了最初的问题,不清楚他们想要什么,所以我添加了另一个版本。
另一种方式:
#include <map>
#include <vector>
#include <boost/iterator/transform_iterator.hpp>
int main() {
using T = double;
std::vector<T> v;
auto f = [](T value) { return std::make_pair(value, 1); };
std::map<T, int> m(boost::make_transform_iterator(v.begin(), f),
boost::make_transform_iterator(v.end(), f));
}
但就可读性和执行速度而言,我认为它并没有超过循环的范围。
对于将数组或向量的值直接转换为映射,我们可以这样做。
map<int, int> mp;
for (int i = 0; i < m; i++)
mp[a[i]]++;
其中a[i]是我们随身携带的数组。
相关文章:
- 如何在 perl 中将多维映射从 c++ 转换为哈希
- 将C++映射转换为 Java 映射
- 类型映射资源并将列表转换为矢量(并返回)
- 将多映射转换为空指针,然后转换回多映射
- 如何在没有映射的情况下在枚举和字符串之间进行转换?
- 标准::映射转换器模板
- 将引用对具有shared_ptr作为值的映射转换为对具有shared_ptr const 作为值的映射的引用
- 在映射最小值和最大值时从未签名转换为已签名的最佳方法?
- 在将平截头体从摄影机空间转换为灯光空间以进行阴影映射方面存在主要问题
- 将 JNI -> jobject(基本上是 java 文件中的映射和/或映射的映射)转换为 std::map(c++)
- 将C++映射转换为python字典
- 如何使用STL将结构的矢量转换为映射
- 转换/映射迭代器<A>到迭代器<B>
- 将多映射迭代器转换为随机访问迭代器
- 将 STL 映射转换为结构
- Qt DBus 属性转换为映射
- 将多重映射值从 int 转换为字符串
- 指向成员函数的指针映射:无法将 void (*) 转换为 void (对象::*)
- 转换c++映射到C数组-性能
- 转换/映射方法最佳做法