将vector::iterator分配给字符数组post VS 2003 我试图得到一些最初在微软Visual Studio(VS)2003中编写的C++代码,在VS 2008下编译,并且我很难找到一个有效的解决方案来将向量::迭代器分配给char数组的开头。我知道迭代器从一个定义为简单指针类型(T*)的类类型发展到VS2003和VS2005之间的类类型。下面是我所说的一个简单例子: typedef std::vector<char> CharContainer; typedef CharContainer::iterator InputIt; int FindNumMsgs( InputIt _inputIter, int _len ); int ProcessBufferForMsgs( char buf[], const size_t maxlen ) { int numMsgs = FindNumMsgs( InputIt(buf), maxlen ); ... } typedef std::vector CharContainer; typedef CharContainer::迭代器输入; int FindNumMsgs(输入输入器,输入器); int ProcessBufferForMsgs(字符buf[],常量大小\u t最大值) { int numMsgs=FindNumMsgs(InputIt(buf),maxlen); ... }

将vector::iterator分配给字符数组post VS 2003 我试图得到一些最初在微软Visual Studio(VS)2003中编写的C++代码,在VS 2008下编译,并且我很难找到一个有效的解决方案来将向量::迭代器分配给char数组的开头。我知道迭代器从一个定义为简单指针类型(T*)的类类型发展到VS2003和VS2005之间的类类型。下面是我所说的一个简单例子: typedef std::vector<char> CharContainer; typedef CharContainer::iterator InputIt; int FindNumMsgs( InputIt _inputIter, int _len ); int ProcessBufferForMsgs( char buf[], const size_t maxlen ) { int numMsgs = FindNumMsgs( InputIt(buf), maxlen ); ... } typedef std::vector CharContainer; typedef CharContainer::迭代器输入; int FindNumMsgs(输入输入器,输入器); int ProcessBufferForMsgs(字符buf[],常量大小\u t最大值) { int numMsgs=FindNumMsgs(InputIt(buf),maxlen); ... },c++,visual-studio-2003,stl,C++,Visual Studio 2003,Stl,因此,在VS2003中,编译和工作没有问题(因为迭代器定义为T*)。在VS2008中,C2440(函数样式转换)会出现此错误,因为我不能再仅使用buf指针分配迭代器。既然迭代器是一种类类型,我该如何在VS2008中实现这一点?我可以将缓冲区复制到一个向量中,然后传入myVec.begin(),但我必须认为我可以避免这种开销。如果FindNumMsgs接受char*作为第一个参数,也许您可以使用一个简单的char*指针: int ProcessBufferForMsgs( char buf[],

因此,在VS2003中,编译和工作没有问题(因为迭代器定义为T*)。在VS2008中,C2440(函数样式转换)会出现此错误,因为我不能再仅使用buf指针分配迭代器。既然迭代器是一种类类型,我该如何在VS2008中实现这一点?我可以将缓冲区复制到一个向量中,然后传入myVec.begin(),但我必须认为我可以避免这种开销。

如果
FindNumMsgs
接受
char*
作为第一个参数,也许您可以使用一个简单的
char*
指针:

int ProcessBufferForMsgs( char buf[], const size_t maxlen )
{
    char* simpleIterator = buf;
    int numMsgs = FindNumMsgs( simpleIterator, maxlen );
    ...
}

如果
FindNumMsgs
接受
char*
作为第一个参数,也许您可以使用一个简单的
char*
指针:

int ProcessBufferForMsgs( char buf[], const size_t maxlen )
{
    char* simpleIterator = buf;
    int numMsgs = FindNumMsgs( simpleIterator, maxlen );
    ...
}

FindNumMsgs的签名是什么?如果需要一个字符*,您可以用
buf
替换
InputIt(buf)
。如果没有,在不改变FindNumMsgs的情况下,你几乎无能为力。

FindNumMsgs的签名是什么?如果需要一个字符*,您可以用
buf
替换
InputIt(buf)
。如果没有,那么在不改变FindNumMsgs的情况下,您几乎无能为力。

重构时间到了。您需要更改FindNumMsgs,以获取(const?)char*作为输入,或者提供第二个重载版本。更好的方法是将其制作成一个模板化函数,它接受任何具有迭代器或指针语义的开始/结束对。

重构时间到了。您需要更改FindNumMsgs,以获取(const?)char*作为输入,或者提供第二个重载版本。更好的方法是将它变成一个模板化的函数,它接受任何具有迭代器或指针语义的开始/结束对。

正确的解决方案是使用模板
FindNumMsgs
,这样它就可以使用迭代器或指针(因为指针可以很好地用作迭代器)。大概是这样的:

template <class T>
int FindNumMsgs(T it, int count) {
    while(count--) {
        // do whatever
        it++;
    }
    return n;
}
模板
int FindNumMsgs(T it,int count){
而(计数--){
//做任何事
it++;
}
返回n;
}

正确的解决方案是使用模板
FindNumMsgs
,这样它可以与迭代器或指针一起工作(因为指针可以很好地用作迭代器)。大概是这样的:

template <class T>
int FindNumMsgs(T it, int count) {
    while(count--) {
        // do whatever
        it++;
    }
    return n;
}
模板
int FindNumMsgs(T it,int count){
而(计数--){
//做任何事
it++;
}
返回n;
}

FindNumMsgs采用vector::iterator作为第一个参数。这个问题的重点是避免更改函数调用,这比我的简单示例所暗示的要多。我只看到两个选项:(1)将FindNumMsgs转换为模板(接受仲裁迭代器)或使用char*或const char*参数重载它。(2) 将缓冲区复制到向量并使用向量的迭代器。FindNumMsgs将向量::迭代器作为第一个参数。这个问题的重点是避免更改函数调用,这比我的简单示例所暗示的要多。我只看到两个选项:(1)将FindNumMsgs转换为模板(接受仲裁迭代器)或使用char*或const char*参数重载它。(2) 将缓冲区复制到向量并使用向量的迭代器。FindNumMsgs中的第一个参数是vector::iterator。FindNumMsgs中的第一个参数是vector::iterator。嗯,有很多函数需要重构,坦率地说,模板化在这里会被过度使用。同样,我可以将缓冲区复制到一个向量中,传入它的.begin()操作符,然后开始我的快乐之路,但我觉得必须有一种方法来做到这一点,而不必进行复制。有时我感觉就像广告中那个家伙在他的割草机上说:“我欠了很多债!”:-)我主要是想弄清楚一个人是否仍然可以直接在数组上使用迭代器,而无需将其复制到容器中。这取决于vector::iterator的实现。在任何情况下,您都不应该费心将指针打包到vector::iterator中。这个“应该”的意思是不要尝试。如果你懒得修改任何东西,你仍然可以尝试在发布模式下编译你的代码。同样,我可以将缓冲区复制到一个向量中,传入它的.begin()操作符,然后开始我的快乐之路,但我觉得必须有一种方法来做到这一点,而不必进行复制。有时我感觉就像广告中那个家伙在他的割草机上说:“我欠了很多债!”:-)我主要是想弄清楚一个人是否仍然可以直接在数组上使用迭代器,而无需将其复制到容器中。这取决于vector::iterator的实现。在任何情况下,您都不应该费心将指针打包到vector::iterator中。这个“应该”的意思是不要尝试。如果您懒得更改任何内容,您仍然可以尝试在发布模式下编译代码。标准库更喜欢使用begin、end作为参数,而不是begin、count。我会跟随他们。您可以在函数调用中始终使用begin+count。没错,但我想提供一个与他现有代码一致的解决方案。但是,请不要忘记
fill\n
和类似的;-)。后