c++:从vector::insert返回迭代器

Posted

技术标签:

【中文标题】c++:从vector::insert返回迭代器【英文标题】:c++: Returning iterator from 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();

但一般情况下并非如此

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

以上是关于c++:从vector::insert返回迭代器的主要内容,如果未能解决你的问题,请参考以下文章

将派生类中的对象插入到所述对象的另一个实例中(使用 vector.insert 函数)C++

C++,如何从迭代器返回对成员变量的引用

C++ - 迭代从 find_if 返回的 std::vector<>

返回 c++ 迭代器

返回 C++ 迭代器引用

C++ STL list迭代器