gpt4 book ai didi

C++:检查 vector 是否是 vector 的子集

转载 作者:太空宇宙 更新时间:2023-11-04 11:23:24 25 4
gpt4 key购买 nike

我有以下一段代码。我有两个字符串 (k1, k2),我使用空白定界符 (t1, t2) 将它们分成标记。然后我想检查 t1 是否包含在 t2 中。问题是即使使用 isSubset(t1, t1) 我也得到 0 返回值。我想避免使用 vector<string>而不是 vector<StringRef> , 如果可能的话。我究竟做错了什么?输出应该是两个 1,但我得到的却是两个 0。

#include<string>
#include<iostream>
#include <time.h>
#include <string.h>
#include <vector>
#include <algorithm>

using namespace std;

class StringRef
{
private:
char const* begin_;
int size_;

public:
int size() const { return size_; }
char const* begin() const { return begin_; }
char const* end() const { return begin_ + size_; }

std::string toString() {
std::string value(begin_);
return value;
}

StringRef( char const* const begin, int const size )
: begin_( begin )
, size_( size )
{}

bool operator<(const StringRef& s) const
{
return (strcmp(begin(), s.begin()) < 0);
}
};


/************************************************
* Checks if vector B is subset of vector A *
************************************************/
bool isSubset(std::vector<StringRef> A, std::vector<StringRef> B)
{
std::sort(A.begin(), A.end());
std::sort(B.begin(), B.end());
return std::includes(A.begin(), A.end(), B.begin(), B.end());
}


/************************************************
* Split string using delimeter; returns vector *
************************************************/
vector<StringRef> split3( string const& str, char delimiter = ' ' )
{
vector<StringRef> result;

enum State { inSpace, inToken };

State state = inSpace;
char const* pTokenBegin = 0; // Init to satisfy compiler.
for( auto it = str.begin(); it != str.end(); ++it )
{
State const newState = (*it == delimiter? inSpace : inToken);
if( newState != state )
{
switch( newState )
{
case inSpace:
result.push_back( StringRef( pTokenBegin, &*it - pTokenBegin ) );
break;
case inToken:
pTokenBegin = &*it;
}
}
state = newState;
}
if( state == inToken )
{
result.push_back( StringRef( pTokenBegin, &str.back() - pTokenBegin ) );
}
return result;
}

int main()
{

string k1 = "9 10";
string k2 = "9 10 2 3";
vector<StringRef> t1 = split3(k1,' ');
vector<StringRef> t2 = split3(k2,' ');

cout<<isSubset(t1,t1)<<endl;
cout<<isSubset(t2,t1)<<endl;
return 0;
}

编辑:------ 更正 ------

已更改 toString到:

std::string toString() const {
std::string value(begin_, size_);
return value;
}

已更改 operator<至:(感谢@Mike Seymour)

bool operator<(const StringRef& s) const
{
return (std::lexicographical_compare(begin(), end(), s.begin(), s.end()));
}

最后,在 split3 ,将 return 语句之前的 if block 更改为:

if( state == inToken )
{
result.push_back( StringRef( pTokenBegin, &str.back() + 1 - pTokenBegin ) );
}

最佳答案

此代码中存在问题。

result.push_back( StringRef( pTokenBegin, &str.back() - pTokenBegin ) );

包含一个差一错误,因此最后一个标记的大小总是太短。

return (strcmp(begin(), s.begin()) < 0);

std::string value(begin_);

依赖 \0 终止的 C 字符串,但您没有使用 \0 终止的 C 字符串。

std::string toString() {

应该是一个常量方法。

在我解决了所有这些问题之后,代码就可以工作了。

关于C++:检查 vector<Class> 是否是 vector<Class> 的子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27504239/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com