如何将数组中的单个元素复制到特定位置的向量?

问题描述 投票:0回答:1

我一直试图让它工作一段时间,但错误要么太模糊,要么是不相关的东西。 我对编码很陌生,所以更复杂的解决方案对我来说可能太多了。

int main() {
    string NATOltr[27]{ ' ','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z' };
    string NATOwrd[27]{ "-","alfa","bravo","charlie","delta","echo","foxtrot","golf","hotel","india","juliett","kilo","lima","mike","november","oscar","papa","quebec","romeo","sierra","tango","uniform","victor","whiskey","xray","yankee","zulu" };

    vector<string> input3xt{ 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd' };
    vector<string> output3xt;
    for (int i = 0; i <= input3xt.size(); i++) {
        for (int j = 0; j <= 26; j++) {
            if (input3xt[i] == NATOltr[j]) { (output3xt[i] = NATOwrd[j]) ;
            output3xt.push_back(i)
                std::cout << "_"; }
        }
    }
    for (int i = 0; i < output3xt.size(); i++) {
        std::cout << output3xt[i] << "\n";
    }

}

通常输入向量或循环数没有定义,但我试图隔离问题。我正在尝试制作一个北约字母切换器,在线编译器只会给出其他错误,而 Visual Studio 将我发送到这段代码:

    _NODISCARD _CONSTEXPR20 size_type size() const noexcept {
        auto& _My_data = _Mypair._Myval2;
        return static_cast<size_type>(_My_data._Mylast - _My_data._Myfirst);
    }

    _NODISCARD _CONSTEXPR20 size_type max_size() const noexcept {
        return (_STD min)(
            static_cast<size_type>((numeric_limits<difference_type>::max)()), _Alty_traits::max_size(_Getal()));
    }

    _NODISCARD _CONSTEXPR20 size_type capacity() const noexcept {
        auto& _My_data = _Mypair._Myval2;
        return static_cast<size_type>(_My_data._Myend - _My_data._Myfirst);
    }

    _NODISCARD _CONSTEXPR20 _Ty& operator[](const size_type _Pos) noexcept /* strengthened */ {
        auto& _My_data = _Mypair._Myval2;
#if _CONTAINER_DEBUG_LEVEL > 0
        _STL_VERIFY(
            _Pos < static_cast<size_type>(_My_data._Mylast - _My_data._Myfirst), "vector subscript out of range");
#endif // _CONTAINER_DEBUG_LEVEL > 0

        return _My_data._Myfirst[_Pos];
    }

    _NODISCARD _CONSTEXPR20 const _Ty& operator[](const size_type _Pos) const noexcept /* strengthened */ {
        auto& _My_data = _Mypair._Myval2;
#if _CONTAINER_DEBUG_LEVEL > 0
        _STL_VERIFY(
            _Pos < static_cast<size_type>(_My_data._Mylast - _My_data._Myfirst), "vector subscript out of range");
#endif // _CONTAINER_DEBUG_LEVEL > 0

        return _My_data._Myfirst[_Pos];
    }

    _NODISCARD _CONSTEXPR20 _Ty& at(const size_type _Pos) {
        auto& _My_data = _Mypair._Myval2;
        if (static_cast<size_type>(_My_data._Mylast - _My_data._Myfirst) <= _Pos) {
            _Xrange();
        }

编辑:做了一些建议的更改,忘记了我最初使用的是字符向量,重新添加了它。 编辑 2:谢谢 paulmckenziethomas-matthews 向我展示在表格类别中,如果有疑问,请始终使用不同的类型。 现在我该如何关闭它?

c++ arrays for-loop vector segmentation-fault
1个回答
0
投票

如评论中所述,您正在尝试使用

[]
来索引没有元素的向量。

output3xt[i] = NATOwrd[j]

如 cppreference.com 的文档中所述,这会调用未定义的行为。

与 std::map::operator[] 不同,此运算符从不向容器中插入新元素。通过此运算符访问不存在的元素是未定义的行为。

此外,根据评论,您最好使用

std::map
来模拟字符到字符串的映射。如果你这样做,那么这将成为
std::transform
的一个非常简单的应用。

#include <map>
#include <vector>
#include <string>
#include <iostream>
#include <algorithm>

int main() {
    std::map<char, std::string> nato_map = {
      {' ', "-"}, {'a', "alpha"}, {'b', "bravo"}, {'c', "charlie"},
      {'d', "delta"}, {'e', "echo"}, {'f', "foxtrot"}, {'g', "golf"},
      {'h', "hotel"}, {'i', "india"}, {'j', "juliet"}, {'k', "kilo"},
      {'l', "lima"}, {'m', "mike"}, {'n', "november"}, {'o', "oscar"},
      {'p', "papa"}, {'q', "quebec"}, {'r', "romeo"}, {'s', "sierra"},
      {'t', "tango"}, {'u', "uniform"}, {'v', "victor"}, 
      {'w', "whiskey"}, {'x', "xray"}, {'y', "yankee"}, {'z', "zulu"}
    };

    std::string input = "hello world";
    std::vector<std::string> output;

    std::transform(
      input.cbegin(), input.cend(),
      std::back_inserter(output),
      [&](auto ch) { return nato_map[ch]; }
    );

    for (auto s : output) {
        std::cout << s << "\n";
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.