gpt4 book ai didi

C++:读取数据集并检查 vector 是否是 vector 的子集

转载 作者:行者123 更新时间:2023-11-28 02:36:02 25 4
gpt4 key购买 nike

我有以下一段代码。该代码创建了一个 vector 数据集,其中的每个元素都是一个 vector 。它还创建了一个 vector S。

我想检查 Dataset 的哪个 vector 包含 S 的 vector 。显然我做错了什么,因为对于下面的例子,数据集是:
一个 b c
一个d
一个 b d

和小号:
一个b

它应该打印:0 2

对我来说它打印:0 1 2

#include <iostream>
#include <fstream>
#include <sstream>
#include <string.h>
#include <string>
#include <time.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_; }

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

bool operator<(const StringRef& obj) const
{
return (strcmp(begin(),obj.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());
}


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() {

vector<vector<StringRef> > Dataset;
vector<vector<StringRef> > S;

ifstream input("test.dat");
long count = 0;
int sec, lps;
time_t start = time(NULL);

cin.sync_with_stdio(false); //disable synchronous IO

for( string line; getline( input, line ); )
{
Dataset.push_back(split3( line ));
count++;
};
input.close();
input.clear();

input.open("subs.dat");
for( string line; getline( input, line ); )
{
S.push_back(split3( line ));
};



for ( std::vector<std::vector<StringRef> >::size_type i = 0; i < S.size(); i++ )
{
for(std::vector<std::vector<StringRef> >::size_type j=0; j<Dataset.size();j++)
{

if (isSubset(Dataset[j], S[i]))
{
cout << j << " ";
}

}
}

sec = (int) time(NULL) - start;
cerr << "C++ : Saw " << count << " lines in " << sec << " seconds." ;
if (sec > 0) {
lps = count / sec;
cerr << " Crunch speed: " << lps << endl;
} else
cerr << endl;

return 0;
}

最佳答案

你的 StringRef type 是危险的,因为它包含一个 const char *指针,但没有所有权的概念。因此指针可能会在构造对象后的某个时刻失效。

确实这就是这里发生的事情:您有一个字符串 ( line ) 并创建 StringRef s 带有指向其内部数据的指针。当稍后修改字符串时,这些指针将失效。

您应该创建一个 vector<std::string>而是为了防止这个问题。

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

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