我需要将地图的每个元素(每对元素的第一个和第二个)插入到字符串中。我查找的每个解决方案都有类似的内容:
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>&)'
如何输出地图的每个元素?特别是在字符串中!
答案 0 :(得分:3)
使用stringstream
为一般map
执行此操作,其中键和值重载operator<<
。
stringstream makeMyString;
for(map<string, int>::iterator iter = theMap.begin(); iter != theMap.end(); ++iter)
{
makeMyString << iter->first << " " <<iter->second;
}
string myString = makeMyString.str();
答案 1 :(得分:2)
编译器告诉你出了什么问题。没有匹配的函数调用,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());
答案 2 :(得分:1)
“没有匹配函数来调用'std :: basic_string :: insert(const std :: basic_string&amp;)'” - 非常正确 - 请参阅insert docs。
你可以使用追加作为Yuushi评论;如果您要追加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>&)
但是如果代码的两个部分有相同的好主意它可能会变得混乱......稍微更难改变使用的分隔符字符串,尽管你可以添加自己的iomanipulator很少工作(很像std::fill()
)。