有条件地将贴图关键帧复制到向量
Conditionally copy map keys to a vector
我有一个映射容器。我想把它的所有键和用户指定的第一个字母复制到一个向量。如何以有效的方式做到这一点?非常感谢。
std::map(std:string, size_t) myMap;
myMap.insert(std:make_pair("Ace", 11);
myMap.insert(std:make_pair("Ape", 12);
myMap.insert(std:make_pair("Age", 13);
myMap.insert(std:make_pair("Beat", 21);
myMap.insert(std:make_pair("Boat", 22);
myMap.insert(std:make_pair("Boss", 23);
myMap.insert(std:make_pair("Coat", 31);
myMap.insert(std:make_pair("Cost", 32);
myMap.insert(std:make_pair("Cast", 33);
例如,如果我想从myMap中提取所有以"Bo"开头的键的元素,并将满意的结果填充到myVec,那么myVec将具有以下元素:
Boat
Boss
为简洁起见省略的声明:
begin = myMap.lower_bound("Bo");
end = std::find_if(begin, myMap.end(), first_does_not_begin_with("Bo"));
for (i=begin; i!=end; ++i)
myVec.push_back(i->first);
你可以实现first_does_not_begin_with
函子类,对吧?操作员应具有以下签名:
bool operator()(std::pair<const std::string, size_t> const &);
如果可以假设表示字符串的字母是连续的并且如果"one-past-z"仍然是有效的字符串字符,则可以使用对lower_bound
和transform
的两个调用,这两个调用的范围都在向量中。
const_iterator start = myMap.lower_bound("Bo");
const_iterator finish = myMap.lower_bound("Bp"); // "Bo" with the last digit incremented by 1
struct Transformer
{
mapKey operator()(const myMapType::value_type& item)
{
return item.first;
}
}
vector<mapKey> output;
std::transform(start, finish, std::back_inserter(output), Transformer());
除了myMap
,您还可以保留一个multimap
,它将以两个字母的字符串作为关键字,并以原始映射的迭代器作为值。map::insert
返回一个迭代器(通过pair
(,您可以将其放入multimap
对象中。
每当您需要高效地搜索2个字母的键时,只需查找multimap
,即可获得原始映射的迭代器并使用它们。
multimap
对象只不过是原始地图上的索引,这是数据库系统中使用的一种想法。重要的是要知道原始map
中应该有大量的项,否则使用multimap
作为索引器就没有那么有利了。
我的解决方案:
std::string token = "Bo"; //first few letters
std::vector<std::string> myVec;
for(std::map<std::string,size_t>::iterator i=myMap.begin();i!=myMap.end();i++)
{
if ( token == i->first.substr(0, token.size()) )
myVec.push_back(i->first);
}
for(std::vector<std::string>::iterator i=myVec.begin();i!=myVec.end();i++ )
std::cout << *i << std::endl;
输出:
Boat
Boss
完整演示:http://www.ideone.com/03cps
如果你喜欢<algorithm>
和<iterator>
,那么你可以这样做:
std::vector<std::string> myVec=std::for_each(myMap.begin(),myMap.end(),collector("Bo"));
std::ostream_iterator<std::string> oiterator(std::cout, "n");
std::copy(myVec.begin(), myVec.end(), oiterator);
输出:
Boat
Boss
函子collector
实现为:
struct collector
{
std::string token;
std::vector<std::string> keys;
collector(const std::string & token) : token(token) {}
void operator()(const std::pair<std::string,size_t> &p)
{
if ( token == p.first.substr(0, token.size()) )
keys.push_back(p.first);
}
operator std::vector<std::string>() { return keys; }
};
完整演示:http://www.ideone.com/U1299
相关文章:
- 将指向给定子类的指针从一个向量复制到另一个向量
- 为共享 ptr 向量实现复制 c'tor?
- 如何在不复制的情况下将一个向量移动到另一个向量中
- 具有 STL 向量类型成员的类的复制内存
- 将字符向量复制到另一个向量
- 如何从字符串向量构造对象并避免复制?
- 在 Cython 中将C++向量转换为 numpy 数组,而无需复制
- 尝试通过memcpy复制大尺寸浮点向量时的分割错误
- 将shared_ptr的向量复制到抽象基的派生类
- 如何避免将向量的完整值复制到另一个容器
- C++向量的哪一部分在传递给函数时被复制
- 如何在向量列表初始化时避免对象复制以及如何延长临时的生存期
- 如何将 int4 数组复制到 int8 向量中
- 复制向量本身
- 在 C++11 中高效复制向量
- 复制向量为成员变量的对象的构造函数
- 不复制向量类成员
- 在不使用元素复制赋值运算符的情况下复制向量 - 可移植性
- 在复制构造函数中复制向量的向量
- 从常量变量复制向量