尝试将字符串向后推入向量

时间:2018-11-12 22:21:33

标签: c++

#include <iostream>
#include <vector>
#include <string>
#include <stdio.h>
#include <stdlib.h>
using namespace std;

class thing{
public:
    vector<unsigned short> vec;
    thing(string);
};

int main(){
    thing adam("12345");
    for(int i = adam.vec.size() - 1;i >= 0;i--){
        cout << adam.vec[i] << endl;
    }
}

thing::thing(string str){
    for(int i = str.size() - 1; i >= 0;i--){
        cout << str[i] << endl;
        vec.push_back(str[i]);
    }
}

我正在尝试创建一个构造函数,该构造函数接受一个字符串并以相反的字符串填充向量,但与其将值5,4,3,2,1填充到向量中,不如将其53,52,51,59,49填充到向量中。 。当我打电话给push_back()时,我会感到困惑。

2 个答案:

答案 0 :(得分:2)

  

我正在尝试创建一个构造函数,该构造函数接收一个字符串并以相反的字符串填充向量

您可能真的不想这样做。正如@JesperJuhl建议的那样-您始终可以反向访问该字符串。为什么要复制?

  

而不是用矢量5,4,3,2,1填充矢量,而是用53,52,51,59,49填充矢量

您误以为'5''4''3'和它们的整数值。字符串元素的值是数字,但这些数字是某些字符集的索引。无需赘述-这是您所用字符集的相关片段:

enter image description here

实际上,字符'5'在字符集中的索引为53(十进制),'4'的索引为52,依此类推。

答案 1 :(得分:0)

for(int i = adam.vec.size() - 1;i >= 0;i--)
    cout << adam.vec[i] << endl;

您以相反顺序插入的代码可以正常工作。但是,您也会以相反的顺序显示矢量,因此它会返回到先前的顺序。要以正确的顺序显示,只需使用:

thing adam("12345");
for(size_t i = 0; i < adam.vec.size(); i++)
    cout << adam.vec[i] << ' ';
cout << endl;
//or 
for(const auto &element : adam.vec)
    cout << element << ' ';
cout << endl;

您的方法for(int i = str.size() - 1; i >= 0;i--){...}在大多数情况下可以向后迭代,但是将size强制转换为int可能是一个问题。标准库提供了其他方法。示例:

thing::thing(string str) 
{
    std::copy(str.crbegin(), str.crend(), std::back_inserter(vec));
}

或使用iterators向前或向后移动。