我正在以这种方式使用std :: map:
#include <map>
#include <string>
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
map<string, int> my_map;
my_map.insert(pair<string, int>("Ab", 1));
my_map.insert(pair<string, int>("Abb", 2));
my_map.insert(pair<string, int>("Abc", 3));
my_map.insert(pair<string, int>("Abd", 4));
my_map.insert(pair<string, int>("Ac", 5));
my_map.insert(pair<string, int>("Ad", 5));
cout<<my_map.lower_bound("Ab")->second<<endl;
cout<<my_map.upper_bound("Ab")->second<<endl;
return 0;
}
我想获取其键以特定字符串开头的所有值(例如“Ab”)。我可以使用map :: lower_bound轻松获取begin迭代器。但是我怎样才能获得上限?我是否必须从下限开始迭代整个集合并检查每个键是否仍然以“Ab”开头?
答案 0 :(得分:1)
我找到了类似的答案,请查看此页:(map complex find operation)
Code Exert:
template<typename Map> typename Map::const_iterator
find_prefix(Map const& map, typename Map::key_type const& key)
{
typename Map::const_iterator it = map.upper_bound(key);
while (it != map.begin())
{
--it;
if(key.substr(0, it->first.size()) == it->first)
return it;
}
return map.end(); // map contains no prefix
}
看起来好像在这个例子中你从upper_bound向后迭代直到开始寻找特定的子串
这个例子略有不同,但应该作为一个好的构建块服务器
答案 1 :(得分:1)
class BeginWithKey
{
public:
BeginWithKey(const string key);
bool operator()(const string& s,const int x);
private:
const string& key_;
};
BeginWithKey::BeginWithKey(const string key):key_(key)
{
}
bool BeginWithKey::operator()(const string& s, const int& rh)
{
bool begin = true;
for(int i = 0; i < key_.size() && begin; ++i)
begin = (s[i] == key_[i]);
return !begin;
}
int main()
{
//your code
//copying the map object
map<string, int> copy = my_map;
//removing the strings not beginning with abc
BeginWithKey func("abc");
remove_if(copy.begin(), copy.end(), func);
return 0;
}
代码可以使用任何字符串键。
答案 2 :(得分:1)
你可以使用Boost filter iterator给普通迭代器提供一个“开始”和一个“结束”迭代器,当它们给出一个谓词时(bool函数说明要包含哪些值)
例如:
template <class Predicate>
boost::filter_iterator<Predicate, map<string,int>::const_iterator> begin(Predicate predicate) const
{
return boost::make_filter_iterator(predicate, my_map.begin(), my_map.end());
}
template <class Predicate>
boost::filter_iterator<Predicate, map<string,int>::const_iterator> end(Predicate predicate) const
{
return boost::make_filter_iterator(predicate, my_map.end(), my_map.end());
}
struct isMatch
{
isMatch(const std::string prefix) {m_prefix = prefix;};
bool operator()(std::string value)
{
return value.find_first_of(m_prefix) == 0;
};
std::string m_prefix;
};
//using:
isMatch startWithAb("Ab");
auto myBegin = boost::filter_iterator<startWithAb> begin();
auto myEnd = boost::filter_iterator<startWithAb> end();