我在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 );
并且编译器没有给我一个错误。
答案 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)
答案 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