从 iterator.first 获取价值
Get value from iterator.first
我开始了一个小玩具项目,作为自学 C++ 的一种方式,但遇到了瓶颈。在下面的代码中,突出显示的行导致构建错误:
welcome.cc:65:26: error: cannot convert
'std::_Rb_tree_iterator >' to 'char' in
assignment
current = result.first;
我不确定为什么。目标是为英文地名创建马尔可夫链,该行的目的是用前一个随机选择的值更新生成的地名中的当前字母,我的随机选择方法取自 this question.正如我所说,C++ 新手,不知道我做错了什么。
int main(int argc, char**argv) {
string line;
ifstream myfile;
std::multimap<char, char> m;
myfile.open ("C:\Users\james\Desktop\placenames.txt");
if (myfile.is_open()){
while ( getline (myfile,line) )
{
for(std::string::size_type i = 0; i < line.size(); ++i) {
std::cout<<line[i]<<std::endl;
m.insert(std::pair<char, char>(line[i], line[i+1]));
}
}
for (std::multimap<char, char>::iterator it = m.begin();it != m.end(); ++it)
cout << " [" << (*it).first << ", " << (*it).second << "]" << endl;
myfile.close();
// for( auto it = m.begin(), end = m.end();it != end; it = m.upper_bound(it->first))
// cout << (*it).first << ' ' << m.count( (*it).first) << endl;
auto current = 'A';
std::string name = "A";
typedef std::multimap<const char, char>::iterator MMAPIterator;
for (int j=0; j<8; ++j){
std::pair<MMAPIterator, MMAPIterator> result = m.equal_range(current);
std::size_t sz = std::distance(result.first, result.second);
std::size_t idx = std::rand() % sz;
std::advance(result.first, idx);
current = result.first; <------THIS LINE
//name+=current;
}
cout << name;
}
else cout << "Unable to open file";
return 0;
}
顺便说一句,我知道它是马尔可夫链的一个非常幼稚的实现。正如我所说,意图是玩弄 c++ 而不是其他任何东西。
你这里有一个双层对,首先是 equal_range
函数 returns 一个范围,所以你的
std::size_t sz = std::distance(result.first, result.second);
告诉您范围内有多少项,要获得该范围内的一个元素(您的字符对),您需要
auto random_element = result.first;
auto the_const_char = random_element.first;
auto the_non_const_char = random_element.second;
我开始了一个小玩具项目,作为自学 C++ 的一种方式,但遇到了瓶颈。在下面的代码中,突出显示的行导致构建错误:
welcome.cc:65:26: error: cannot convert 'std::_Rb_tree_iterator >' to 'char' in assignment current = result.first;
我不确定为什么。目标是为英文地名创建马尔可夫链,该行的目的是用前一个随机选择的值更新生成的地名中的当前字母,我的随机选择方法取自 this question.正如我所说,C++ 新手,不知道我做错了什么。
int main(int argc, char**argv) {
string line;
ifstream myfile;
std::multimap<char, char> m;
myfile.open ("C:\Users\james\Desktop\placenames.txt");
if (myfile.is_open()){
while ( getline (myfile,line) )
{
for(std::string::size_type i = 0; i < line.size(); ++i) {
std::cout<<line[i]<<std::endl;
m.insert(std::pair<char, char>(line[i], line[i+1]));
}
}
for (std::multimap<char, char>::iterator it = m.begin();it != m.end(); ++it)
cout << " [" << (*it).first << ", " << (*it).second << "]" << endl;
myfile.close();
// for( auto it = m.begin(), end = m.end();it != end; it = m.upper_bound(it->first))
// cout << (*it).first << ' ' << m.count( (*it).first) << endl;
auto current = 'A';
std::string name = "A";
typedef std::multimap<const char, char>::iterator MMAPIterator;
for (int j=0; j<8; ++j){
std::pair<MMAPIterator, MMAPIterator> result = m.equal_range(current);
std::size_t sz = std::distance(result.first, result.second);
std::size_t idx = std::rand() % sz;
std::advance(result.first, idx);
current = result.first; <------THIS LINE
//name+=current;
}
cout << name;
}
else cout << "Unable to open file";
return 0;
}
顺便说一句,我知道它是马尔可夫链的一个非常幼稚的实现。正如我所说,意图是玩弄 c++ 而不是其他任何东西。
你这里有一个双层对,首先是 equal_range
函数 returns 一个范围,所以你的
std::size_t sz = std::distance(result.first, result.second);
告诉您范围内有多少项,要获得该范围内的一个元素(您的字符对),您需要
auto random_element = result.first;
auto the_const_char = random_element.first;
auto the_non_const_char = random_element.second;