模板方法' For Loop'反向矢量

时间:2016-06-10 23:09:22

标签: c++ templates vector reverse

我有一个方法可以反转向量的对象。我希望无论数据类型如何都能使用该方法,因此我使用模板。 EX: " 1 2 3 4"成为" 4 3 2 1" &安培; "现在怎么样的棕牛"现在变成"牛棕色"

这是我当前的模板方法。(为复制和粘贴添加完整代码)

#include "stdafx.h"  
#include <iostream>  
using namespace std;
template <class T>
void fillVector(vector<T>& vect, const T array[], int size)
{
for (int index = 0; index < size; ++index)
    vect.push_back(array[index]);
}

template<class T>
void reverse(vector<T>& vect)
{

    if (vect.empty())
    {
        throw EmptyVectorException();
    }

    else
    {

        int endVal = vect.size();

        for (int x = 0, y = endVal-1; x < (endVal / 2); x++, y--)
        {
            T temp = vect[x];
            vect[x] = vect[y];
            vect[y] = temp;
        }
    }

}


template<class T>
void output(const vector<T>& vect)
{
    for (int index = 0; index < static_cast<int>(vect.size()); index++)
    {
        cout << vect[index] << " ";
    }
}

int main()
{

const string  strings[] = { "How ", "Now ", "Brown ", "Cow" };
const char chars[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
const int intNmbrs[] = { 1, 3, 5, 7, 9, 11, 13 };
const double dblNmbrs[] = { 11.1, 22.2, 33.3, 44.4, 55.5, 66.6 };

const int STRINGS_SIZE = sizeof(strings) / sizeof(strings[0]);
const int CHARS_SIZE = sizeof(chars) / sizeof(chars[0]);
const int INTS_SIZE = sizeof(intNmbrs) / sizeof(intNmbrs[0]);
const int DOUBLES_SIZE = sizeof(dblNmbrs) / sizeof(dblNmbrs[0]);

vector<int> intVector;
vector<double> doubleVector;
vector<string> stringVector;
vector<char> charVector;

// Fill the "vector" objects
fillVector(intVector, intNmbrs, INTS_SIZE);
fillVector(doubleVector, dblNmbrs, DOUBLES_SIZE);
fillVector(stringVector, strings, STRINGS_SIZE);
fillVector(charVector, chars, CHARS_SIZE);

vector<int> emptyVector;

cout << "\nExample #3: Reverse the sequence of all \"vector\" objects";
reverse(intVector);
reverse(doubleVector);
reverse(stringVector);
reverse(charVector);

cout << "\n  \"intVector\":    ";
output(intVector);
cout << "\n  \"doubleVector\": ";
output(doubleVector);
cout << "\n  \"stringVector\": ";
output(stringVector);
cout << "\n  \"charVector\":   ";
output(charVector);
cout << endl;


return 0;
}

我遇到了这些错误:

&#39; std :: vector&#39;:太多的模板广告

&#39; std :: vector&#39;:没有合适的默认构造函数

&#39; x&#39;:未声明的标识符

&#39; y&#39;:未声明的标识符

我不知道为什么我的x和y没有被声明。它们只是用于操作for循环的整数,与模板T完全无关。

我想也许这与我编写反向方法的方式有关,所以我决定编写一个反向方法来处理一个向量,如果单独进行查看是否有效。     vector test = {1,2,3,4,5,6,7,8,9};

int sizeOf = test.size();    

for (int x = 0, y = sizeOf-1; x < (sizeOf / 2); x++, y--)
{
    int temp = test[x];
    test[x] = test[y];
    test[y] = temp;
}

此代码工作正常。所以我知道它与我如何编码我的反向算法无关。

我做了一些搜索,发现当你尝试传递模板太多参数时,'std::vector': too many template arugments错误经常会弹出。我不相信我的情况就是如此(但我可能非常错,是吗?)

对于'std::vector': no appropriate default constructor available,看起来这种情况下的常见问题与一个具有默认构造函数的类(通常是隐式)有关。然而,我没有类模板,所以我不认为(再次,可能是错误的。非常新的)我有任何应该被调用的构造函数。

思考?

已阅读No appropriate default constructor

Too many template Parameter

1 个答案:

答案 0 :(得分:1)

我没有收到您的确切错误,但我已在下面标明相关修正。

我通过AStyle运行代码来修复格式化。

//#include "stdafx.h"
#include <iostream>

#include <vector>           //!FIX
#include <string>           //!FIX

using namespace std;
template <class T>
void fillVector(vector<T>& vect, const T array[], int size)
{
    for (int index = 0; index < size; ++index)
        vect.push_back(array[index]);
}

template<class T>
void reverse(vector<T>& vect)
{

    if (vect.empty())
    {
        //throw EmptyVectorException;
        return;     //!FIX
    }

    else
    {

        int endVal = vect.size();

        for (int x = 0, y = endVal-1; x < (endVal / 2); x++, y--)
        {
            T temp = vect[x];
            vect[x] = vect[y];
            vect[y] = temp;
        }
    }

}


template<class T>
void output(const vector<T>& vect)
{
    for (int index = 0; index < static_cast<int>(vect.size()); index++)
    {
        cout << vect[index] << " ";
    }
}

int main()
{

    const string  strings[] = { "How ", "Now ", "Brown ", "Cow" };
    const char chars[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
    const int intNmbrs[] = { 1, 3, 5, 7, 9, 11, 13 };
    const double dblNmbrs[] = { 11.1, 22.2, 33.3, 44.4, 55.5, 66.6 };

    const int STRINGS_SIZE = sizeof(strings) / sizeof(strings[0]);
    const int CHARS_SIZE = sizeof(chars) / sizeof(chars[0]);
    const int INTS_SIZE = sizeof(intNmbrs) / sizeof(intNmbrs[0]);
    const int DOUBLES_SIZE = sizeof(dblNmbrs) / sizeof(dblNmbrs[0]);

    vector<int> intVector;
    vector<double> doubleVector;
    vector<string> stringVector;
    vector<char> charVector;

// Fill the "vector" objects
    fillVector(intVector, intNmbrs, INTS_SIZE);
    fillVector(doubleVector, dblNmbrs, DOUBLES_SIZE);
    fillVector(stringVector, strings, STRINGS_SIZE);
    fillVector(charVector, chars, CHARS_SIZE);

    vector<int> emptyVector;

    cout << "\nExample #3: Reverse the sequence of all \"vector\" objects";
    reverse(intVector);
    reverse(doubleVector);
    reverse(stringVector);
    reverse(charVector);

    cout << "\n  \"intVector\":    ";
    output(intVector);
    cout << "\n  \"doubleVector\": ";
    output(doubleVector);
    cout << "\n  \"stringVector\": ";
    output(stringVector);
    cout << "\n  \"charVector\":   ";
    output(charVector);
    cout << endl;


    return 0;
}

我认为最好将其发布到代码审查网站。