C ++ Универсальная функция свопинга - PullRequest
0 голосов
/ 10 марта 2012

В моем классе. Я получил:

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 ]

3 голосов
/ 10 марта 2012

Это выглядит как ошибка, так как никогда не будет верным:

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().Я предполагаю, что lit - это char[][], поэтому 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 голос
/ 10 марта 2012

1) Почему Swap() ученик? Члены класса должны как-то быть тесно связаны с вашими классами. В большинстве случаев это признак плохого дизайна, если что-то, которое не использует закрытые члены или очень похоже на метод, который (например, метод удобства), становится членом класса. C ++ - это не Java, где все должно принадлежать классу. Сделайте ваш метод swap() автономным шаблоном.

2) Еще лучше, не изобретать велосипед. std::swap() есть, и это работает очень хорошо. Во многих случаях вы можете ожидать, что методы и классы, предоставляемые стандартной библиотекой, будут работать лучше, чем то, что вы могли бы написать.

3) В вашем классе вы назвали метод Sort(), но вопрос о Swap(). Поскольку вы не написали, что ожидали и что на самом деле происходит, это единственное, что я могу найти, что может быть не так.

4) Не используйте strtok() в C ++, если нет необходимости. char* являются строками в стиле C и не должны использоваться в C ++. Вместо этого используйте std::string.

...