我需要将map的每个元素(每个pair元素的第一个和第二个)插入到字符串中。我查过的每个解决方案都做了类似的事情:
for(map<string, int>::iterator iter = theMap.begin(); iter != theMap.end(); ++iter)
{
myString.insert(iter->first);
myString.insert(iter->first);
}
我一直得到一个错误,说no matching function for call to 'std::basic_string<char>::insert(const std::basic_string<char>&)'
如何输出映射的每个元素?特别是在字符串!
对于键和值重载operator<<
的一般map
,使用stringstream
来执行此操作。
stringstream makeMyString;
for(map<string, int>::iterator iter = theMap.begin(); iter != theMap.end(); ++iter)
{
makeMyString << iter->first << " " <<iter->second;
}
string myString = makeMyString.str();
编译器告诉你哪里出错了。没有匹配的函数调用,insert
通常是insert(position, string)
。
所以你可以这样做:
stringstream stringmaker;
stringmaker << iter->first << iter->second; //You need to do this to convert your
// int key into a string.
myString.insert(myString.size(), stringmaker.str())
或更好
myString.append(stringmaker.str());
"没有匹配的函数调用'std::basic_string::insert(const std::basic_string&)'" -非常正确-参见insert文档。
你可以像Yuushi评论的那样使用append;如果你想添加iter->second
,你首先需要将其转换为std::string
,可能是boost::lexical_cast<std::string>(iter->second)
,或者使用std::ostringstream oss; oss << iter->second; myString.append(oss.str());
。
或者,您可以使用流,在这种情况下,最灵活的方法是首先编写一个函数,将std::map
输出到std::ostream
,然后将其应用到std::ostringstream
,然后调用.str()
以获得std::string
版本:
void output_iterator_over_pairs(std::ostream& os, Iterator begin, Iterator end,
const char* between_pairs = ", ",
const char* inside_pairs = ":')
{
for (bool first = true; begin != end; ++begin)
{
if (first) first = false; else os << between_pairs;
os << begin->first << inside_pairs << begin->end;
}
}
然后你可以这样做:
std::ostringstream oss;
output_iterator_over_pairs(oss, theMap.begin(), theMap.end());
// use oss.str()...
你实际上可以重载operator<<(std::ostream&, const std::map<T, U>&)
,但如果代码的两个部分有相同的绝妙想法,它可能会变得混乱…更改所使用的分隔符字符串也稍微困难一些,不过您可以添加自己的iomanippers(非常类似于std::fill()
)。