как создать работающий вектору которого есть метод стирания (size_t pos)? - PullRequest
0 голосов
/ 05 июля 2011

Я создаю класс C ++ wstring для использования с версией mingw 4.3.0, кросс-компиляция для Win32.Я хочу, чтобы моя строка работала как std::string, что означает, что я хочу метод erase(int pos), который стирает один элемент в позиции pos.

Вот моя первая попытка:

#include <wchar.h>
#include <iostream>
#include <vector>

class wstring : public std::vector<wchar_t>{
public:
    void erase(size_t where){
    erase(begin()+where);
    }
};

int main(int argc,char **argv) {
    wstring c1;
    c1.push_back(L'a');
    c1.push_back(L'b');
    c1.push_back(L'c');
    c1.erase(1);

    for(size_t i = 0;i<c1.size();i++){
    std::cout << "c1[" << i << "] = " << c1[i] << "\n";
    }
    return 0;
}

Это похоже на то, что это должно работать для меня, но я получаю эту ошибку компилятора wacko, когда пытаюсь скомпилировать его:

$ i386-mingw32-g++ x1.cpp
x1.cpp: In member function 'void wstring::erase(size_t)':
x1.cpp:8: error: no matching function for call to 'wstring::erase(__gnu_cxx::__normal_iterator<wchar_t*, std::vector<wchar_t, std::allocator<wchar_t> > >)'
x1.cpp:7: note: candidates are: void wstring::erase(size_t)
$ 

Что действительно странно, так это то, что если я уберу метод erase и простовведите код, у меня нет проблем:

#include <wchar.h>
#include <iostream>
#include <vector>

class wstring : public std::vector<wchar_t>{
};

int main(int argc,char **argv) {
    wstring c1;
    c1.push_back(L'a');
    c1.push_back(L'b');
    c1.push_back(L'c');
    c1.erase(c1.begin()+1);

    for(size_t i = 0;i<c1.size();i++){
    std::cout << "c1[" << i << "] = " << c1[i] << "\n";
    }
    return 0;
}

Я озадачен.

Ответы [ 2 ]

5 голосов
/ 05 июля 2011

Ответом на ваш конкретный вопрос является использование std::vector<T>::erase( iterator ) вместо remove:

std::vector<int> v;
v.push_back( 1 );
v.push_back( 2 );
v.push_back( 3 );
v.erase( v.begin()+1 ); // equivalent to v.remove( 1 )

Но я не думаю, что ты лаешь на правильное дерево. В стандартной библиотеке уже есть std::wstring, который является экземпляром basic_string с wchar_t, и он будет максимально приближен к std::string (который является экземпляром того же шаблона с char )

1 голос
/ 05 июля 2011

Вы всегда можете просто использовать существующий тип std::wstring, который является typedef для std::basic_string<wchar_t>.Не стесняйтесь также создавать другие классы строк на основе ваших любимых целочисленных типов.

Обратите внимание, что существуют соответствующие объекты потока std::wcout и т. Д.

...