如何创建<wchar_t>具有擦除(size_t pos)方法的功能向量?

how do I create a functioning vector<wchar_t> that has an erase(size_t pos) method?

本文关键字:方法 pos size 功能 向量 擦除 wchar lt 何创建 创建 gt      更新时间:2023-10-16

我正在创建一个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;
}

这看起来应该对我工作,但是当我试图编译它时,我得到了这个古怪的编译器错误:

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

我迷惑。

您的问题的答案是使用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_stringwchar_t的实例化,并且它将尽可能接近std::string(这是与char相同模板的实例化)

您总是可以使用现有的类型std::wstring,这是std::basic_string<wchar_t>的类型定义。您也可以根据您喜欢的整型创建其他字符串类。

注意有相应的流对象std::wcout