学习STL时的一些问题

时间:2010-11-28 09:01:41

标签: c++ stl

我在Ubuntu的CodeBlocks IDE中使用g ++。 我是STL的新手,也是C ++的一部分。

Q1://回答了

std::istream_iterator< std::string > begin ( dictionaryFile );
std::istream_iterator< std::string > end;
std::vector< std::string> dictionary;
std::copy ( begin, end, std::back_inserter ( dictionary ) );

是正确的,但是当我改变了

std::istream_iterator< std::string > end;

std::istream_iterator< std::string > end();

编译器说第四行没有匹配的函数调用。

Q2://抱歉,我没有第一次清除问题

struct PS : std::pair< std::string, std::string > {
PS();
static struct FirstLess: std::binary_function< PS, PS, bool> {
    bool operator() ( const PS & p, const PS & q ) const {
        return p.first < q.first;
    }
} firstLess1; };


struct FirstLess: std::binary_function< PS, PS, bool> {
bool operator() ( const PS & p, const PS & q ) const {
    return p.first < q.first;
}} firstLess2;

请注意,firstLess1和firstLess2之间的唯一区别是在PS中声明了firstLess1。

当我调用该函数时:

k = std::find_if ( j + 1, finis, std::not1 ( std::bind1st ( PS::firstLess1, *j ) ) );

编译器给了我一个错误'对PS :: firstLess1的未定义引用'。 然后我改为

k = std::find_if ( j + 1, finis, std::not1 ( std::bind1st ( firstLess2, *j ) ) );

然后它通过了编译。

更奇怪的是,在程序的其他部分,我使用了两者

j = std::adjacent_find ( j , finis, PS::firstLess1 );
j = std::adjacent_find ( j , finis, firstLess2 );

并且编译器没有给我一个错误。

3 个答案:

答案 0 :(得分:4)

std::istream_iterator< std::string > end(); C ++将此解释为函数声明,其名称为end,返回值类型为std::istream_iterator< std::string >且参数列表为空。这就是为什么你会得到这样的错误。在C ++中通过调用其类的默认构造函数来创建任何对象,您必须执行此操作type_name variable_name;type_name variable_name();将被解释为函数声明。

答案 1 :(得分:2)

A1:已经回答得很充分了 A2:在firstLess的声明中添加一个const,或者在cpp文件中定义firstLess对象(参见this

答案 2 :(得分:1)

A1:

  

一个对象,其初始化程序是一组空的括号,即(),应进行值初始化。

     

[注意:初始化程序的语法

不允许使用()      

X a();

     

不是X类对象的声明,而是声明一个不带参数并返回X的函数。

     

在某些其他初始化上下文中允许使用form()(5.3.4,5.2.3,12.6.2)。 - 结束说明]

A2:

我不确定你想要什么,std :: find_if和std :: adjacent_find做的事情完全不同。但无论如何,这是一些受你的启发的工作代码。

#include <iostream>
#include <algorithm>
#include <string>
#include <vector>

typedef std::pair<std::string, std::string> TwoStrings;

struct FirstLess : std::binary_function<TwoStrings, TwoStrings, bool>
{
    bool operator() (const TwoStrings& p, const TwoStrings& q) const {
        return p.first < q.first;
    }
};

int main()
{
    std::vector<TwoStrings> v;
    std::vector<TwoStrings>::iterator it;
    v.push_back(TwoStrings("4. Here's ", "Johnny"));
    v.push_back(TwoStrings("1. Here's ", "Johnny"));
    v.push_back(TwoStrings("2. Here's ", "Johnny"));
    v.push_back(TwoStrings("2. Here's ", "Johnny"));
    v.push_back(TwoStrings("3. Here's ", "Johnny"));

    it = std::adjacent_find(v.begin(), v.end(), FirstLess());
    std::cout << it->first << it->second << std::endl;

    it = std::find_if(v.begin() , v.end(), std::not1(std::bind1st(FirstLess(), *(v.begin()))));
    std::cout << it->first << it->second << std::endl;
}

输出是:

1. Here's Johnny
4. Here's Johnny