我正在尝试编写一个从输入文件中获取行的程序,将这些行排序为“签名”,以便将所有相互字谜的单词组合在一起。我必须使用地图,将'签名'存储为键并将与这些签名匹配的所有单词存储到字符串向量中。之后我必须在同一行打印所有彼此字谜的单词。以下是我到目前为止的情况:
#include <iostream>
#include <string>
#include <algorithm>
#include <map>
#include <fstream>
using namespace std;
string signature(const string&);
void printMap(const map<string, vector<string>>&);
int main(){
string w1,sig1;
vector<string> data;
map<string, vector<string>> anagrams;
map<string, vector<string>>::iterator it;
ifstream myfile;
myfile.open("words.txt");
while(getline(myfile, w1))
{
sig1=signature(w1);
anagrams[sig1]=data.push_back(w1); //to my understanding this should always work,
} //either by inserting a new element/key or
//by pushing back the new word into the vector<string> data
//variable at index sig1, being told that the assignment operator
//cannot be used in this way with these data types
myfile.close();
printMap(anagrams);
return 0;
}
string signature(const string& w)
{
string sig;
sig=sort(w.begin(), w.end());
return sig;
}
void printMap(const map& m)
{
for(string s : m)
{
for(int i=0;i<m->second.size();i++)
cout << m->second.at();
cout << endl;
}
}
第一个解释是工作,不知道那么简单!但是现在我的打印功能给了我:
prob2.cc: In function âvoid printMap(const std::map<std::basic_string<char>, std::vector<std::basic_string<char> > >&)â:
prob2.cc:43:36: error: cannot bind âstd::basic_ostream<char>::__ostream_type {aka std::basic_ostream<char>}â lvalue to âstd::basic_ostream<char>&&â
In file included from /opt/centos/devtoolset-1.1/root/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/iostream:40:0,
尝试了许多变化,他们总是抱怨绑定
void printMap(const map<string, vector<string>> &mymap)
{
for(auto &c : mymap)
cout << c.first << endl << c.second << endl;
}
答案 0 :(得分:1)
anagrams[sig1]
将返回对vector<string>
的引用。
sig1 = signature(w1);
anagrams[sig1].push_back(w1);
由于您的代码现在正在编写,它正在尝试替换向量而不是添加到它。例如,假设您的输入包含was
和saw
,并且signature
对字符串的字母进行排序。
您对此案例的要求是:
anagrams["asw"] -> ["was"]
anagrams["asw"] -> ["was", "saw"]
但是,在尝试编写代码时,在步骤6中,不是添加到现有向量,而是使用仅包含“saw”的新向量覆盖当前向量,因此结果将是只是anagrams["asw"] -> ["saw"]
。
就printmap
而言:地图中的项目不是std::string
,而是std::pair<std::string, std::vector<std::string>>
,所以当你尝试这样做时:
void printMap(const map& m)
{
for(string s : m)
......显然无法奏效。我通常会使用:
for (auto s : m)
...这使得编译至少变得容易。但是,要对s
执行任何有用的操作,您需要意识到它是pair
,因此您必须使用s.first
和s.second
(s.first
为string
,s.second
为std::vector<std::string>
。要打印出来,您可能需要打印s.first
,然后打印一些分隔符,然后浏览s.second
中的项目。