C++ 对列表

4 c++ constructor stl list std-pair

在熟悉 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;

}
Run Code Online (Sandbox Code Playgroud)

freq 和 freq2 非常相似,只是 freq2 只是一个列表。Freq 能够接受字符、字符串和迭代器指针,并且两个对 (freq,freq2) 都声明为对。不知道为什么会发生这种情况,有什么提示吗?谢谢。

编辑:现在更有意义了,我得到的所有回复都非常有帮助,谢谢你们!

Vla*_*cow 6

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
Run Code Online (Sandbox Code Playgroud)

更准确地说,在这些语句中,试图std::pair<std::string, int>从 type 的对象构建 type 的对象std::pair<char, int>。这要求类的构造函数具有std::string类型的参数char。然而没有这样的构造函数。

至于这些说法

  freq[0] = std::make_pair(*it,0);        //This is fine
  freq[0] = std::make_pair('S',0);        //This is fine
Run Code Online (Sandbox Code Playgroud)

然后使用了类 的赋值运算符std::basic_string。该类有一个重载的赋值运算符,它接受类型的对象char

basic_string& operator=(charT c);
Run Code Online (Sandbox Code Playgroud)

所以这些说法都是正确的。

考虑下面的例子

#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;
}
Run Code Online (Sandbox Code Playgroud)

输出是

B   2
Run Code Online (Sandbox Code Playgroud)

由于类std::pair具有模板赋值运算符,而类std::string又具有具有 char 类型参数的赋值运算符,因此该代码可以成功编译。

例如,如果你写

std::pair<std::string, int> p1 = std::make_pair( 'a', 1 );
Run Code Online (Sandbox Code Playgroud)

代替

    std::pair<std::string, int> p1 = { "a", 1 };
Run Code Online (Sandbox Code Playgroud)

你会得到一个错误,因为没有从std::pair<char, int>to 的转换std::pair<std::string, int>,因为没有charto的构造函数std::string


Sla*_*ica 5

没有隐式构造函数std::string接受char并可用于将类型转换charstd::string. 你可以使用这个构造函数:

basic_string( size_type count, CharT ch, const Allocator& alloc = Allocator() );

所以

freq2.push_back(std::make_pair( std::string( 1, *it ),0));
Run Code Online (Sandbox Code Playgroud)

等等

  • @YZ.learner:因为它有一个如下所示的赋值运算符: [`std::pair&lt;T1, T2&gt; = std::pair&lt;U1, U2&gt;`](http://en.cppreference.com/ w/cpp/utility/pair/operator%3D),左侧和右侧不必是相同的类型。我们只要求我们可以做到“T1 = U1”和“T2 = U2”。 (2认同)