【问题标题】:c++: Returning iterator from vector::insertc++:从vector::insert返回迭代器
【发布时间】:2017-02-25 22:48:51
【问题描述】:

我正在尝试在指定点将向量 (s1) 的元素插入到不同的向量 (s2) 中。例如,这是通过程序实现的

#include <vector>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
    vector<string> s1;
    s1.push_back("Hi");
    s1.push_back("there!");

    vector<string> s2;
    s2.push_back("How");
    s2.push_back("are");
    s2.push_back("you?");

    vector<string>::iterator it = s2.begin();
    s2.insert(it, s1.begin(), s1.end());

    return 0;
}

但是,如果我希望插入命令返回第一个插入元素的迭代器,我的印象是这个命令应该可以工作

it = s2.insert(it, s1.begin(), s1.end());

但是我收到编译错误

vector_insert.cc:20:8: error: no match for ‘operator=’ (operand types are ‘std::vector<std::__cxx11::basic_string<char> >::iterator {aka __gnu_cxx::__normal_iterator<std::__cxx11::basic_string<char>*, std::vector<std::__cxx11::basic_string<char> > >}’ and ‘void’)
 it = s2.insert(it, s1.begin(), s1.end());

为什么当此页面指示迭代器返回 (http://en.cppreference.com/w/cpp/container/vector/insert) 时,编译器会认为 insert 具有 void 返回。请注意,此示例很简单,因为我可以使用

将迭代器获取到初始插入的元素
it = s2.begin();

但一般情况下并非如此

【问题讨论】:

    标签: c++ vector insert


    【解决方案1】:

    写下我的问题的行为帮助我找到了答案(像往常一样)。我想我会把这个问题留给后代并立即给出答案。

    线索就在 cppreference 页面中 (duh)。 insert 函数的 void 实现一直存在到 C++11;自 C++11 以来的迭代器实现。因此问题只出在我的编译器上。为了修复,我刚刚使用 -std=c++11 标志编译:

    g++ -std=c++11 -o vector_insert vector_insert.cc
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-26
      • 2021-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-07
      相关资源
      最近更新 更多