我写了一个函数,它缩短了所需长度的字符串(单词的句子).我不希望句子的切口碰巧出现在一个单词的中间.所以我跳过n个字符,直到我到达一个空格并在那里剪切句子字符串.我的问题不是一个真正的问题,编译我的函数时会发出一条警告:"警告:未使用计算值",请参阅代码中的注释行.该功能虽然按预期工作.所以,无论是我是盲人,还是我对我的项目都持不同意见,实际上我并不理解这个警告.有人可以指点我的功能缺陷吗?
char *
str_cut(char *s, size_t len) {
char *p = NULL;
int n = 3;
p = s + len;
if (p < (s + strlen (s))) {
/*
* do not cut string in middle of a word.
* if cut-point is no space, reducue string until space reached ...
*/
if (*p != ' ')
while (*p != ' ')
*p--; // TODO: triggers warning: warning: value computed is not used
/* add space for dots and …Run Code Online (Sandbox Code Playgroud) 我有一个对象向量(对象是术语节点,其他字段包含字符串字段与术语字符串)
class TermNode {
private:
std::wstring term;
double weight;
...
public:
...
};
Run Code Online (Sandbox Code Playgroud)
经过一些处理和计算得分后,这些对象最终存储在TermNode指针的向量中,例如
std::vector<TermNode *> termlist;
Run Code Online (Sandbox Code Playgroud)
此向量的结果列表(最多包含400个条目)如下所示:
DEBUG: 'knowledge' term weight=13.5921
DEBUG: 'discovery' term weight=12.3437
DEBUG: 'applications' term weight=11.9476
DEBUG: 'process' term weight=11.4553
DEBUG: 'knowledge discovery' term weight=11.4509
DEBUG: 'information' term weight=10.952
DEBUG: 'techniques' term weight=10.4139
DEBUG: 'web' term weight=10.3733
...
Run Code Online (Sandbox Code Playgroud)
我尝试做的是清理术语列表中短语中包含的子串的最终列表.例如,查看上面的列表片段,有"知识发现"这个短语,因此我想删除单个术语"知识"和"发现",因为它们也在列表中并且在此上下文中是多余的.我想保留包含单个术语的短语.我也在考虑删除所有等于或少于3个字符的字符串.但这只是一个想法.
对于这个清理过程,我想使用remove_if/find_if(使用新的C++ lambdas)编写一个类,并且将该代码放在一个紧凑的类中会很不错.
我不确定如何解决这个问题.问题是我首先必须通过将标志设置为删除标记来识别要删除的字符串.这意味着我必须预先处理该列表.我必须找到包含其中一个单一术语的单个术语和短语.我认为这不是一件容易的事,需要一些先进的算法.使用后缀树来识别子串?
矢量上的另一个循环,也许是相同矢量的副本可以清理.我正在寻找一种最有效的方式.
我一直在玩这个想法或方向,例如在std :: list erase不兼容迭代器中使用remove_if/find_if和从std :: vector中擦除多个对象时使用的想法?.
所以问题基本上是有一种聪明的方法来做到这一点,避免多个循环,我怎么能确定删除的单个术语?也许我真的错过了一些东西,但可能有人在那里给我一个很好的暗示. …
我最初想的一件简单的事情似乎比我想象的要难.我想在复制构造函数中复制int类型的向量向量.
std::vector<std::vector<int> * > * bar;
Run Code Online (Sandbox Code Playgroud)
我试过这个,但它不起作用:
Foo(const Foo& rhs)
: bar(new std::vector<std::vector<int> * >(rhs.vec->size())) {
for (std::size_t i = 0; i < rhs.bar->size(); i++) {
bar->push_back(new std::vector<int>());
for (size_t j = 0; j < (*rhs.bar)[i]->size(); j++) {
bar->back()->push_back((*rhs.bar)[i]->at(j));
}
}
}
Run Code Online (Sandbox Code Playgroud)
我也想过,如果我可以使用的东西swap和back(),但我不知道这是工作了.
有人可以告诉我一个正确的复制方法吗?感谢您的帮助!