[英]C++ List of Pairs
在熟悉C ++ STL的同时,我使用对象列表遇到了这个问题。
int count (std::string input, std::vector<std::string> screen){
std::string::iterator it = input.begin();
std::pair<std::string, int> freq[10];
std::list<std::pair<std::string,int> > freq2;
freq2.push_back(std::make_pair(*it,0)); //ERR:No instance of fn matches arg list
freq2.push_back(std::make_pair('S',0)); //ERR:No instance of fn matches arg list
freq2.push_back(std::make_pair("S",0)); //This is fine
freq[0] = std::make_pair(*it,0); //This is fine
freq[0] = std::make_pair("S",0); //This is fine
freq[0] = std::make_pair('S',0); //This is fine
return 1;
}
freq和freq2都非常相似,只是freq2只是一个列表。 Freq能够接受字符,字符串和迭代器指针,并且两个对(freq,freq2)都被声明为对。 不知道为什么会这样,有什么提示吗? 谢谢。
编辑:现在更有意义了,我得到的所有回复都非常有帮助,谢谢你们!
std::string
中没有隐式构造函数接受char
,可用于将char
类型转换为std::string
。 你可以使用的是这个构造函数:
basic_string(size_type count,CharT ch,const Allocator&alloc = Allocator());
所以
freq2.push_back(std::make_pair( std::string( 1, *it ),0));
等等
类std::basic_string
没有构造函数,其中有一个char
类型的参数。因此这些状态网是无效的
freq2.push_back(std::make_pair(*it,0)); //ERR:No instance of fn matches arg list
freq2.push_back(std::make_pair('S',0)); //ERR:No instance of fn matches arg list
更准确地说,在这些语句中,尝试从std::pair<char, int>
类型的对象构建std::pair<std::string, int>
类型的对象。 这要求类std::string
的构造函数具有char
类型的参数。 但是没有这样的构造函数。
至于这些陈述
freq[0] = std::make_pair(*it,0); //This is fine
freq[0] = std::make_pair('S',0); //This is fine
然后使用类std::basic_string
的赋值运算符。 该类有一个重载赋值运算符,它接受char
类型的对象。
basic_string& operator=(charT c);
所以这些陈述是正确的。
请考虑以下示例
#include <iostream>
#include <string>
#include <utility>
int main()
{
std::pair<std::string, int> p1 = { "a", 1 };
std::pair<char, int> p2 = { 'B', 2 };
p1 = p2;
std::cout << p1.first << '\t' << p1.second << std::endl;
return 0;
}
输出是
B 2
由于类std::pair
有一个模板赋值运算符,而类std::string
又有一个赋值运算符,其参数类型为char,因此该代码编译成功。
如果你愿意写的话
std::pair<std::string, int> p1 = std::make_pair( 'a', 1 );
代替
std::pair<std::string, int> p1 = { "a", 1 };
你会得到一个错误,因为没有从std::pair<char, int>
到std::pair<std::string, int>
因为没有从char
到std::string
构造函数。
问题是你试图从一个char构造一个std::string
。 std::string
没有这样的构造函数。
你似乎混合了char和std :: string类型。 字符串迭代器指向单个char值,而不是std :: string。 有关详细信息,请查看http://www.cplusplus.com/reference/string/string/begin/ 。
另外, 'S'
与"S"
不等同,因为第一个是char类型,而第二个是char *类型,它指向内存中包含'S'
后跟'\\0'
( “null character”与null不同)。
freq2.push_back(std::make_pair(*it,0)); //The iterator is pointing to a literal character value, and not a string
freq2.push_back(std::make_pair('S',0)); //This is a literal character, and not a string literal
freq2.push_back(std::make_pair("S",0)); //This is fine and what you intended
对数组的赋值通过隐式转换完成。 见http://www.cplusplus.com/reference/utility/make_pair/ 。
freq[0] = std::make_pair(*it,0); //Implicit conversion from Pair<char, int>
freq[0] = std::make_pair("S",0); //Implicit conversion from Pair<char*, int>
freq[0] = std::make_pair('S',0); //Implicit conversion from Pair<char, int>
如果你真的需要这种转换功能,那么潜在的解决方法是创建一个std::pair<std::string, int>
类型的变量,然后将值推送到列表中。 我只会在一个绝望和奇怪的情况下推荐这个,而是直接纠正代码的意图。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.