繁体   English   中英

C ++对的列表

[英]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>因为没有从charstd::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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM