C ++通用交换功能

时间:2012-03-10 12:51:19

标签: c++ templates strtok

在我的课堂上,我得到了:

template<class T> void Swap(T, T);

在class.cpp中:

template<class T>
void class::Swap(T& p1, T& p2)
    {
        T aux = p1;
        p1 = p2;
        p2 = aux;
    }

当我尝试:

this->Swap<char*>(&lit[i][k], &lit[i][l]);

另一个问题: 我在这里做错了什么:我想在一些定界符(“+ - ”)之后拆分我的字符串,并且strtok没有像我预期的那样工作。

int counter = 0;
    char* s = strtok(eq_clone ," ");
    while(s != NULL)
    {
        counter++;
        if(s == "")
            counter--;
        s = strtok(eq_clone ,"+-");
    }

2 个答案:

答案 0 :(得分:3)

这看起来像是一个错误,因为它永远不会成真:

if(s == "")

这是将s的地址与字符串文字""的地址进行比较:它不检查s是否为空字符串。使用strtok()的替代方法是boost::algorithm::split

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <boost/algorithm/string/classification.hpp>
#include <boost/algorithm/string/split.hpp>

int main()
{
    std::string s("a,string+with-multiple delimiters");
    std::vector<std::string> s_tokens;

    boost::algorithm::split(s_tokens, s, boost::is_any_of(",+- "));

    std::for_each(s_tokens.begin(),
                  s_tokens.end(),
                  [] (const std::string& s)
                  {
                      std::cout << s << "\n";
                  });
    return 0;
}

输出:

a
string
with
multiple
delimiters

关于交换,正如在评论和其他答案中已经说明的那样,只需使用std::swap()。我猜测litchar[][],因此std::swap(lit[i][k], lit[i][l]);将完全符合您的要求。

编辑:

评论后发出声明string* lit并且lit似乎是一个数组(来自示例用法),然后以这种方式使用std::swap()

std::string* lit = new std::string[4];

lit[0] = "zero";

std::swap(lit[0][1], lit[0][2]); // The characters will be passed by reference,
                                 // don't take address.

std::cout << lit[0] << "\n"; // Prints "zreo"

请注意,Swap()的声明按值传递参数(不正确),但Swap()的定义通过引用传递参数(正确)。如果您更改Swap()的声明并按如下方式调用它,它将起作用(如果您真的不想使用std::swap()

template<class T> void Swap(T&, T&);
                           //^ //^

Swap(lit[i][k], lit[i][l]);

答案 1 :(得分:1)

1)为什么Swap()是班级成员?类成员应该以某种方式紧密耦合到您的类。在大多数情况下,如果不使用私人成员或非常类似于某种方法(即一种方便的方法)的某些东西成为集体成员,那么它就是糟糕设计的标志。 C ++不是java,其中所有东西都必须属于一个类。使您的swap()方法成为一种独立的模板方法。

2)更好的是,不要重新发明轮子。 std::swap()就在那里,而且效果很好。在许多情况下,您可以期望标准库提供的方法和类比您可以编写的内容更好地工作。

3)在您的班级中,您调用了方法Sort(),但问题是Swap()。既然你没有写下你期望发生的事情以及实际发生的事情,那么这是我唯一能找到的可能是错误的事情。

4)除非必须,否则不要在C ++中使用strtok()char*是C-Style字符串,不应在C ++中使用。请改用std::string