将字符串逐个字符插入矢量

时间:2018-08-14 02:58:03

标签: c++ arrays vector char push-back

我正在尝试将字符串的字符插入char向量中,但是要以相反的顺序放置字母。谁能告诉我为什么这行不通

int main()
{
    string a = "Hello";

    vector<char> arr(5);

    for(int i = 4 ; i  ==   0 ; i--)
    {
        arr.push_back(a[i]);
        cout << arr[i];

    }
    return 0;
}

im试图以1的相反顺序推回字符

3 个答案:

答案 0 :(得分:3)

他们的代码有几个问题:

  • 您正在创建一个{strong>大小最初为5的vector,然后尝试将5个其他字符放入其中,总共10个字符。您需要:

    • 初始化其容量,而不是其大小

    • 按原样初始化 size ,但是在循环内使用arr[4-i]而不是arr.push_back()

  • 您的循环根本不会进入,因为i == 0永远都不是。

请尝试以下类似操作:

#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main() {
    string a = "Hello";
    size_t len = a.size();

    vector<char> arr;
    arr.reserve(len);

    for(int i = len-1; i >= 0; i--) {
        arr.push_back(a[i]);
    }

    for(size_t i = 0; i < len; ++i) {
        cout << arr[i];
    }

    return 0;
}

或者:

#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main() {
    string a = "Hello";
    size_t len = a.size();

    vector<char> arr(len);

    for(int i = len-1; i >= 0; i--) {
        arr[len-1-i] = a[i];
    }

    for(size_t i = 0; i < len; ++i) {
        cout << arr[i];
    }

    return 0;
}

另一种以C ++方式处理此问题的方法是改为使用迭代器:

#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main() {
    string a = "Hello";

    vector<char> arr;
    arr.reserve(a.size());

    for(auto iter = a.rbegin(); iter != a.rend(); ++iter) {
        arr.push_back(*iter);
    }

    for(auto ch : arr) {
        cout << ch;
    }

    return 0;
}

或者:

#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main() {
    string a = "Hello";

    vector<char> arr(a.size());
    auto arr_iter = arr.begin();

    for(auto a_iter = a.rbegin(); a_iter != a.rend(); ++a_iter, ++arr_iter) {
        *arr_iter = *a_iter;
    }

    for(auto ch : arr) {
        cout << ch;
    }

    return 0;
}

然后您可以完全摆脱手动循环:

#include <iostream>
#include <string>
#include <vector>
#include <iterator>
#include <algorithm>
using namespace std;

int main() {
    string a = "Hello";

    vector<char> arr;
    arr.reserve(a.size());

    copy(a.rbegin(), a.rend(), back_inserter(arr));

    cout.write(arr.data(), arr.size());

    return 0;
}

或者:

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    string a = "Hello";

    vector<char> arr(a.size());

    copy(a.rbegin(), a.rend(), arr.begin());

    cout.write(arr.data(), arr.size());

    return 0;
}

或者:

#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main() {
    string a = "Hello";

    vector<char> arr(a.rbegin(), a.rend());
    cout.write(arr.data(), arr.size());

    return 0;
}

答案 1 :(得分:2)

我不确定当向量完全能够在构造函数中使用 iterator 时,为什么使问题变得复杂?因此,您的绝大多数代码都可以替换为简单的代码:

vector<char> arr(a.rbegin(), a.rend());

下面的完整程序演示了此操作:

#include <iostream>
#include <string>
#include <vector>

using std::cout; using std::string; using std::vector;

int main() {
    string a = ")-: yug emosdnah a si xaP";
    vector<char> arr(a.rbegin(), a.rend());
    for (auto ch: arr) cout << ch;
    cout << '\n';
}

答案 2 :(得分:0)

for(int i = 4 ; i  ==   0 ; i--)

这意味着在i等于零时继续前进-但是i从4开始,因此for循环立即终止。

您可能是想

for(int i = 4 ; i  >=   0 ; i--)