在 std::vector<std::p air 中找到>
find in std::vector<std::pair>
我有一个成对的向量。该对中的第一个类型为std::string,第二个类型为Container。
std或boost中有什么方便的功能,这样我就可以在给定字符串值作为键的情况下返回Container?
更新
有人评论说,我可以使用std::map,但实际上我需要保留我的项目的顺序,按照我将它们推到向量的顺序。
一个可能的解决方案:
struct comp
{
comp(std::string const& s) : _s(s) { }
bool operator () (std::pair<std::string, Container> const& p)
{
return (p.first == _s);
}
std::string _s;
};
// ...
typedef std::vector<std::pair<std::string, Container> > my_vector;
my_vector v;
// ...
my_vector::iterator i = std::find_if(v.begin(), v.end(), comp("World"));
if (i != v.end())
{
Container& c = i->second;
}
// ...
下面是一个完整的例子:
#include <vector>
#include <utility>
#include <string>
#include <algorithm>
struct Container
{
Container(int c) : _c(c) { }
int _c;
};
struct comp
{
comp(std::string const& s) : _s(s) { }
bool operator () (std::pair<std::string, Container> const& p)
{
return (p.first == _s);
}
std::string _s;
};
#include <iostream>
int main()
{
typedef std::vector<std::pair<std::string, Container> > my_vector;
my_vector v;
v.push_back(std::make_pair("Hello", Container(42)));
v.push_back(std::make_pair("World", Container(1729)));
my_vector::iterator i = std::find_if(v.begin(), v.end(), comp("World"));
if (i != v.end())
{
Container& c = i->second;
std::cout << c._c; // <== Prints 1729
}
}
这是一个活生生的例子。
使用Boost.Range和Boost.Bind,您可以做到这一点:
struct predicate
{
template<class Key, class Pair>
bool operator()(const Key& k, const Pair& p) const
{
return p.first == k;
}
};
// Your vector of pairs
std::vector<std::pair<std:string, Container> v = ...;
// The key you would like to search for
std::string key = ...;
Container& c = boost::find_if(v, boost::bind(predicate(), key, _1))->second;
有一个简单的解决方案:使用std::copy
和std::inserter
:
#include <algorithm>
#include <map>
#include <string>
#include <utility> // pair
#include <vector>
void function()
{
typedef int Data;
typedef std::pair< std::string, Data > String_Data_Pair;
typedef std::vector< String_Data_Pair > String_Data_Pair_Sequence;
typedef std::map< std::string, Data > String_To_Data_Map;
String_Data_Pair_Sequence string_data_pairs;
/* fill 'string_data_pairs' here */
String_To_Data_Map string_to_data_map;
std::copy( string_data_pairs.begin(),
string_data_pairs.end(),
std::inserter( string_to_data_map,
string_to_data_map.begin() /* superfluous, but required */ ) );
}
class SomeClass{
int num;
public:
SomeClass();
void setNumber(int n) const { num = n;}
};
vector<pair<SomeClass,string> > vectr;
for(unsigned int i = 0; i < vectr.size(); i++)
if(vectr[i].second == "key")
vectr[i].first.setNumber(50);
为我工作!
相关文章:
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- std::具有相同基类的类的变体
- std::向量与传递值的动态数组
- 使用std::vector的OpenCL矩阵乘法
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- std::condition_variable::wait()如何评估给定的谓词
- 如何获取std::result_of函数的返回类型
- std::原子加载和存储都需要吗
- 将对象移动到std::shared_ptr
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- 是std :: set&lt; std :: future&gt;不可能存在
- 在修改列表后,std :: list&lt; t&gt; :: end()的值是否会更改
- 使用 std::vector<boost::shared_ptr<Base_Class>> 或 boost::p tr_vector 的性能注意事项是什么<Base>
- std::map<std::set, double> AND std:<long>map< std::p air<long, long>, double>
- 如何获取std::vector<DMatch>