相关疑难解决方法(0)

将std :: vector附加到自身,未定义的行为?

这个问题使我不确定将一个向量附加到自身.所以问题是:遵循代码行做我所期望的,但它是否符合标准?

vec.reserve(vec.size() * 2):
vec.insert(vec.end(), vec.begin(), vec.end());
Run Code Online (Sandbox Code Playgroud)

以下(不reserve())仍然有效,是否符合标准?

vec.insert(vec.end(), vec.begin(), vec.end());
Run Code Online (Sandbox Code Playgroud)

还是实施依赖?

c++ vector language-lawyer

14
推荐指数
1
解决办法
1052
查看次数

通过引用相同向量的元素插入向量

我想知道更有经验的人是否能够澄清这是否是对矢量进行的错误操作:

std::vector<int> v{1, 2, 3, 4, 5};
v.insert(v.begin() + 1, v[0]);
Run Code Online (Sandbox Code Playgroud)

我问的原因是因为要插入的元素是对向量中第0个元素的引用.如果插入强制向量调整大小(因为其容量已满),则引用v[0]将无效,并且代码可能会插入不正确的值.这里有一些伪代码可能会证明:

template <typename T>
void vector_insert_method(Iterator pos, const T& value) {
    if capacity full:
        reallocate array and copy over element
        // if value was reference to elem in this vector,
        // that reference might be invalidated


    insert element

    ++size
}
Run Code Online (Sandbox Code Playgroud)

在并发系统上,此问题可能更为现实.

如果您尝试插入在您尝试插入的位置之后的元素,会发生类似且相关的问题.例如,执行类似v.insert(v.begin(), v[2])因为标准指出插入点之后对元素的引用无效.这保证有效吗?

c++ reference vector

13
推荐指数
1
解决办法
892
查看次数

使用copy和back_inserter将向量附加到自身时出现错误的结果

这个问题的启发,询问如何将一个向量附加到自身,我的第一个想法是以下(是的,我意识到insert现在是一个更好的选择):

#include <algorithm>
#include <iostream>
#include <iterator>
#include <vector>

int main() {
    std::vector<int> vec {1, 2, 3};
    std::copy (std::begin (vec), std::end (vec), std::back_inserter (vec));

    for (const auto &v : vec)
        std::cout << v << ' ';
}
Run Code Online (Sandbox Code Playgroud)

但是,这打印:

1 2 3 1 * 3
Run Code Online (Sandbox Code Playgroud)

每次运行程序时*都是不同的数字.只有2被替换的事实是特殊的,如果真的有解释,我会有兴趣听到它.继续,如果我附加到不同的向量(原始副本),它会正确输出.如果我在前一行之前添加以下行,它也会正确输出copy:

vec.reserve (2 * vec.size());
Run Code Online (Sandbox Code Playgroud)

std::back_inserter尽管事先没有预留内存,但我认为这是一种将元素添加到容器末端的安全方法.如果我的理解是正确的,复制线有什么问题?

我假设它与编译器无关,但我使用的是GCC 4.7.1.

c++ iterator stl undefined-behavior stl-algorithm

11
推荐指数
1
解决办法
1347
查看次数

为什么`copy_n`,`fill_n`和`generate_n`?

为什么_n版本的copy,fill并且generate已经在C++ 11中提供了,为什么只有这些算法呢?

algorithm standards stl stl-algorithm c++11

7
推荐指数
2
解决办法
541
查看次数

将std :: vector的副本附加到自身的末尾

我正在尝试制作一个字符串向量的副本,并将其附加到其原始向量的末尾,即复制其内容.例:

 Input : vector<string> s = {"abc", "def"}
 Output: vector<string> s = {"abc", "def", "abc", "def"}
Run Code Online (Sandbox Code Playgroud)

我正在使用插入方法,即

s.insert(s.end(), s.begin(), s.end());
Run Code Online (Sandbox Code Playgroud)

但是,这表现出与编译器相关的结果.在,LLVM clang,它给了我预期的答案.

GCC给了我

 Output: vector<string> s = {"abc", "def", "", ""}
Run Code Online (Sandbox Code Playgroud)

我想知道为什么会发生这种情况以及实现此向量复制目标最安全的方法是什么?

以下是该程序的ideone.com链接:http://ideone.com/40CH8q

c++ gcc iterator llvm clang

3
推荐指数
2
解决办法
1026
查看次数