Beberapa Masalah saat mempelajari STL

Saya menggunakan g++ di CodeBlocks IDE di Ubuntu. Saya baru mengenal STL dan beberapa bagian dari C++.

Q1: //dijawab

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 ) );

benar, tetapi ketika saya berubah

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

ke dalam

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

kompiler mengatakan tidak ada pemanggilan fungsi yang cocok di baris keempat.

Q2: //maaf saya tidak menjelaskan masalahnya pada kali pertama

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;

Perhatikan bahwa satu-satunya perbedaan antara firstLess1 dan firstLess2 adalah firstLess1 dideklarasikan di PS.

ketika saya memanggil fungsi:

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

kompiler memberi saya kesalahan 'referensi tidak terdefinisi ke PS::firstLess1'. dan kemudian saya berubah menjadi

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

kemudian melewati kompilasi.

Yang lebih aneh lagi, di beberapa bagian lain dari program ini, saya menggunakan keduanya

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

dan kompiler tidak memberi saya kesalahan.


person user522829    schedule 28.11.2010    source sumber
comment
OKE. Saya sudah menemukan cara menyelesaikan pertanyaan kedua. (tapi masih belum tahu kenapa) cukup gunakan k = std::find_if ( j + 1, finis, std::not1 ( std::bind1st ( PS::FirstLess (), *J ) ) ); tidak masalah atau Anda dapat menambahkan const PS::FirstEqual PS::firstEqual1 = PS::FirstEqual(); setelah deklarasi.   -  person user522829    schedule 28.11.2010


Jawaban (3)


std::istream_iterator< std::string > end(); C++ menafsirkan ini sebagai deklarasi fungsi dengan nama end tipe nilai kembalian std::istream_iterator< std::string > dan daftar argumen kosong. Itu sebabnya Anda mendapatkan kesalahan seperti itu. Di C++ untuk membuat objek apa pun dengan memanggil konstruktor default kelasnya, Anda hanya perlu melakukan ini type_name variable_name;. type_name variable_name(); akan diartikan sebagai deklarasi fungsi.

person Mihran Hovsepyan    schedule 28.11.2010
comment
Inilah yang kami sebut sebagai penguraian yang paling menjengkelkan. - person In silico; 28.11.2010

A1: sudah dijawab dengan cukup
A2: tambahkan const ke deklarasi firstLess, ATAU tentukan objek firstLess dalam file cpp (lihat ini)

person smerlin    schedule 28.11.2010
comment
+1 untuk mendefinisikan objek firstLess, yaitu dalam cakupan terlampir (lihat baris teratas di halaman tertaut). Dalam hal ini menambahkan const tidak ada bedanya karena itu hanya berfungsi untuk anggota statis bertipe integral, bukan struct. (Yang mengejutkan adalah kompiler mengizinkan panggilan adjacent_find().) - person j_random_hacker; 28.11.2010
comment
@j_random_hacker: perbaiki. Tapi haruskah itu hanya berfungsi untuk tipe integral? itu telah berhasil untuk saya dengan struct POD juga di masa lalu... - person smerlin; 28.11.2010
comment
Saya tidak tahu :) Saya hanya bisa mengatakan bahwa itu tidak diharapkan berhasil. Tetapi kompiler bebas mengizinkan apa pun yang tidak bertentangan dengan standar, dan menurut saya hal ini tidak bertentangan. - person j_random_hacker; 28.11.2010

A1:

Objek yang penginisialisasinya berupa kumpulan tanda kurung kosong, yaitu (), harus diinisialisasi nilai.

[ Catatan: karena () tidak diizinkan oleh sintaks untuk penginisialisasi,

X a ();

bukan deklarasi objek kelas X, namun deklarasi fungsi yang tidak mengambil argumen dan mengembalikan X.

Bentuk () diperbolehkan dalam konteks inisialisasi tertentu lainnya (5.3.4, 5.2.3, 12.6.2). — catatan akhir ]

A2:

Saya tidak begitu yakin apa yang Anda inginkan, std::find_if dan std::adjacent_find melakukan sesuatu yang sangat berbeda. Tapi bagaimanapun, berikut adalah beberapa kode kerja yang terinspirasi oleh Anda.

#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;
}

Outputnya adalah:

1. Here's Johnny
4. Here's Johnny
person Palmik    schedule 28.11.2010